<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Software Bits Newsletter]]></title><description><![CDATA[Short stories on software design and performance.]]></description><link>https://softwarebits.substack.com</link><image><url>https://substackcdn.com/image/fetch/$s_!JQf-!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsoftwarebits.substack.com%2Fimg%2Fsubstack.png</url><title>Software Bits Newsletter</title><link>https://softwarebits.substack.com</link></image><generator>Substack</generator><lastBuildDate>Sat, 20 Jun 2026 16:44:13 GMT</lastBuildDate><atom:link href="https://softwarebits.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Taras Tsugrii]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[softwarebits@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[softwarebits@substack.com]]></itunes:email><itunes:name><![CDATA[Taras Tsugrii]]></itunes:name></itunes:owner><itunes:author><![CDATA[Taras Tsugrii]]></itunes:author><googleplay:owner><![CDATA[softwarebits@substack.com]]></googleplay:owner><googleplay:email><![CDATA[softwarebits@substack.com]]></googleplay:email><googleplay:author><![CDATA[Taras Tsugrii]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Involutions: The License to Update in O(1)]]></title><description><![CDATA[Why Zobrist hashing updates a chessboard in constant time, and the property that makes incremental computation possible.]]></description><link>https://softwarebits.substack.com/p/involutions-the-license-to-update</link><guid isPermaLink="false">https://softwarebits.substack.com/p/involutions-the-license-to-update</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Wed, 14 Jan 2026 20:51:59 GMT</pubDate><content:encoded><![CDATA[<p>For best reading experience consider reading on <a href="https://ttsugriy.github.io/perf-bits/involutions.html">my github</a>.</p><p>Here&#8217;s a puzzle from competitive chess programming:</p><p><strong>A chess engine evaluates millions of positions per second. Many are duplicates&#8212;reached via different move orders. How does it recognize positions it&#8217;s already seen?</strong></p><p>The naive answer: hash the board and check a table.</p><p>But &#8220;hash the board&#8221; hides a cost. A chessboard has 64 squares, each potentially holding one of 12 piece types. Hashing from scratch is O(64) per position.</p><p>At millions of positions per second, that adds up.</p><p>The actual answer: <strong>update the hash incrementally in O(1)</strong>.</p><p>Move a knight from b1 to c3? Two operations. Not 64.</p><p>The technique is called Zobrist hashing. And it works because of a single mathematical property.</p><div><hr></div><h2>The Property</h2><p>An <strong>involution</strong> is a function that is its own inverse:</p><p>f(f(x))=x<em>f</em>(<em>f</em>(<em>x</em>))=<em>x</em></p><p>Apply it twice, you&#8217;re back where you started.</p><p>The simplest example: XOR.</p><p>a&#8853;a=0<em>a</em>&#8853;<em>a</em>=0</p><p>a&#8853;0=a<em>a</em>&#8853;0=<em>a</em></p><p>XOR any value with itself, you get zero. XOR with zero, you get the original back. This means XOR is reversible&#8212;and the forward and reverse operations are identical.</p><p>This unlocks three capabilities:</p><ul><li><p><strong>Add = Remove</strong>: Same operation to insert and delete</p></li><li><p><strong>No history needed</strong>: Don&#8217;t track what was added when</p></li><li><p><strong>O(1) updates</strong>: Cost independent of total size</p></li></ul><p>To modify a hash, you don&#8217;t need to know how it was built&#8212;just what changed.</p><div><hr></div><h2>Zobrist Hashing</h2><p>Albert Zobrist invented this technique in 1970 for computer Go. It&#8217;s now standard in every serious chess engine.</p><h3>Setup</h3><p>Generate a table of random 64-bit numbers:</p><pre><code><code>import random

# One random number for each (piece, square) combination
zobrist_table = {}
for piece in ['P', 'N', 'B', 'R', 'Q', 'K', 'p', 'n', 'b', 'r', 'q', 'k']:
    for square in range(64):
        zobrist_table[(piece, square)] = random.getrandbits(64)

# Additional random numbers for game state
zobrist_black_to_move = random.getrandbits(64)
zobrist_castling = [random.getrandbits(64) for _ in range(16)]
zobrist_en_passant = [random.getrandbits(64) for _ in range(8)]
</code></code></pre><p>These numbers are generated once at startup and never change.</p><h3>Initial Hash</h3><p>To hash a position from scratch:</p><pre><code><code>def hash_position(board):
    h = 0
    for square in range(64):
        piece = board[square]
        if piece:
            h ^= zobrist_table[(piece, square)]

    if board.black_to_move:
        h ^= zobrist_black_to_move
    # ... castling rights, en passant, etc.

    return h
</code></code></pre><p>XOR together the random numbers for every piece on its square. O(n) where n is the number of pieces.</p><h3>Incremental Update</h3><p>Here&#8217;s where involutions pay off.</p><p>When a knight moves from b1 (square 1) to c3 (square 18):</p><pre><code><code>def update_hash_for_move(h, piece, from_sq, to_sq):
    h ^= zobrist_table[(piece, from_sq)]  # Remove piece from old square
    h ^= zobrist_table[(piece, to_sq)]    # Add piece to new square
    h ^= zobrist_black_to_move            # Toggle side to move
    return h
</code></code></pre><p>Three XOR operations. Constant time. The hash after the move is exactly what you&#8217;d get from hashing the new position from scratch.</p><p><strong>Why does this work?</strong></p><p>XOR is an involution. &#8220;Removing&#8221; a piece means XORing with the same value that &#8220;added&#8221; it. No separate undo operation needed.</p><pre><code><code>hash = ... ^ zobrist[N][b1] ^ ...     # Knight on b1 contributes to hash

hash ^= zobrist[N][b1]                 # XOR same value &#8594; removes contribution
hash ^= zobrist[N][c3]                 # XOR new value &#8594; adds new contribution
</code></code></pre><p>The knight&#8217;s contribution to the hash is completely replaced. The 62 other squares are unaffected.</p><div><hr></div><h2>Try It Yourself</h2><p>I built an interactive demo where you can move pieces and watch the XOR operations happen in real-time:</p><p><strong><a href="https://ttsugriy.github.io/perf-bits/zobrist-demo.html">&#8594; Interactive Zobrist Hashing Demo</a></strong></p><p>Notice: whether you move a pawn (1 XOR out, 1 XOR in) or capture a queen (2 XOR out, 1 XOR in), the operation count stays constant. The other 62 squares are never touched.</p><div><hr></div><h2>Why XOR Specifically?</h2><p>XOR isn&#8217;t the only involution. Why not use subtraction? After all:</p><p>a&#8722;a=0<em>a</em>&#8722;<em>a</em>=0</p><p>Three reasons make XOR ideal for hashing:</p><h3>1. Bitwise Independence</h3><p>XOR operates on each bit independently. No carries, no overflow.</p><pre><code><code>  10110011
^ 11001010
----------
  01111001
</code></code></pre><p>This means the random numbers can be generated for each bit position separately, maximizing entropy distribution.</p><h3>2. Order Independence (Commutativity)</h3><p>a&#8853;b=b&#8853;a<em>a</em>&#8853;<em>b</em>=<em>b</em>&#8853;<em>a</em></p><p>The hash doesn&#8217;t depend on the order pieces were added. Two positions with the same pieces produce the same hash regardless of move history.</p><h3>3. No Accumulation Bias</h3><p>With addition/subtraction, values can grow unboundedly or cluster around certain ranges. XOR keeps the hash uniformly distributed across the full 64-bit range.</p><p>OperationSelf-inverse?Commutative?Bounded?Bit-independent?XOR&#10003; (a&#8853;a=0)&#10003;&#10003;&#10003;Addition/Subtraction&#10007; (need inverse op)&#10003;&#10007;&#10007;Multiplication&#10007;&#10003;&#10007;&#10007;</p><p>XOR is unique: adding and removing use the <em>same</em> operation. With addition, you must subtract to undo&#8212;a different operation that requires knowing what was added.</p><div><hr></div><h2>The Transposition Table</h2><p>Zobrist hashing enables <strong>transposition tables</strong>&#8212;caches of previously evaluated positions.</p><pre><code><code>1. e4 e5 2. Nf3 Nc6     &#8594;  position P
1. Nf3 Nc6 2. e4 e5     &#8594;  same position P
</code></code></pre><p>Different move orders, identical position. Same Zobrist hash.</p><p>When the engine encounters a position:</p><pre><code><code>def evaluate_with_cache(position, depth):
    h = position.zobrist_hash

    if h in transposition_table:
        cached = transposition_table[h]
        if cached.depth &gt;= depth:
            return cached.score  # Skip expensive search

    score = expensive_minimax_search(position, depth)
    transposition_table[h] = Entry(score, depth)
    return score
</code></code></pre><p>At depth 20, a chess engine might explore 10&#8313; positions. With a good transposition table, it might only evaluate 10&#8311; unique positions. The rest are cache hits.</p><p><strong>O(1) hash updates make this practical.</strong> If updating the hash cost O(64) per move, the overhead would dwarf the savings.</p><div><hr></div><h2>Collision Reality</h2><p>Zobrist hashing isn&#8217;t cryptographically secure. Collisions happen.</p><p>With a 64-bit hash and 2&#179;&#178; positions, the birthday paradox predicts roughly one collision. In practice, chess engines search far more positions than that.</p><p><strong>Does it matter?</strong></p><p>Usually not. A collision means two different positions share a hash. The engine might:</p><ul><li><p>Return the wrong cached evaluation</p></li><li><p>Prune a branch incorrectly</p></li></ul><p>These are rare and the impact is statistical, not catastrophic. The engine plays slightly worse on rare occasions. Acceptable for a 100x speedup.</p><p>For applications where correctness matters absolutely, you&#8217;d verify the full position on cache hits&#8212;but that adds overhead.</p><div><hr></div><h2>Beyond Chess: Rolling XOR</h2><p>The same principle applies anywhere you need incremental hash updates.</p><p><strong>Sliding window over a byte stream:</strong></p><pre><code><code>from collections import deque

def rolling_xor_hash(window_size):
    h = 0
    buffer = deque()

    def add_byte(b):
        nonlocal h
        h ^= b
        buffer.append(b)
        if len(buffer) &gt; window_size:
            old = buffer.popleft()
            h ^= old  # Remove old byte's contribution
        return h

    return add_byte
</code></code></pre><p>Each byte added, one byte removed. O(1) regardless of window size.</p><p>This is simpler than polynomial rolling hashes (Rabin-Karp), though it has weaker collision properties. For applications where speed matters more than collision resistance&#8212;like deduplication with verification&#8212;it&#8217;s often sufficient.</p><div><hr></div><h2>Beyond Chess: CRDTs</h2><p>Conflict-free Replicated Data Types (CRDTs) enable distributed systems to merge state without coordination.</p><p><strong>XOR-based sets</strong> exploit involutions:</p><pre><code><code>class XORSet:
    def __init__(self):
        self.hash = 0
        self.elements = set()

    def add(self, x):
        if x not in self.elements:
            self.hash ^= hash(x)
            self.elements.add(x)

    def remove(self, x):
        if x in self.elements:
            self.hash ^= hash(x)  # Same operation as add!
            self.elements.discard(x)
</code></code></pre><p>Two replicas can independently add and remove elements. Merging is deterministic because XOR is commutative and associative.</p><div><hr></div><h2>Beyond Chess: The rsync Algorithm</h2><p>Here&#8217;s a different flavor of incremental hashing&#8212;one that synchronizes files across a network.</p><p><strong>The problem</strong>: You have a 1GB file locally. The server has a slightly modified version. Sending the entire file wastes bandwidth. But you don&#8217;t know <em>which</em> bytes changed.</p><p><strong>rsync&#8217;s insight</strong>: Use rolling checksums to find matching blocks without transferring them.</p><h3>The Protocol</h3><ol><li><p><strong>Receiver</strong> (has old file): Split into blocks, compute weak checksum (Adler-32) + strong checksum (MD5) for each block, send list to sender</p></li><li><p><strong>Sender</strong> (has new file): Compute rolling checksum at every byte offset, match against list</p></li><li><p><strong>Result</strong>: Send only &#8220;match block B2&#8221; references + the changed bytes</p></li></ol><p>The magic is computing checksums at <em>every byte offset</em> efficiently.</p><h3>The Rolling Checksum</h3><p>rsync uses a variant of Adler-32. For a window of bytes [a1,a2,&#8230;,an][<em>a</em>1&#8203;,<em>a</em>2&#8203;,&#8230;,<em>an</em>&#8203;]:</p><p>A=&#8721;i=1naimodM<em>A</em>=<em>i</em>=1&#8721;<em>n</em>&#8203;<em>ai</em>&#8203;mod<em>M</em></p><p>B=&#8721;i=1n(n&#8722;i+1)&#8901;aimodM<em>B</em>=<em>i</em>=1&#8721;<em>n</em>&#8203;(<em>n</em>&#8722;<em>i</em>+1)&#8901;<em>ai</em>&#8203;mod<em>M</em></p><p>When the window slides one byte (drop a1<em>a</em>1&#8203;, add an+1<em>an</em>+1&#8203;):</p><p>A&#8242;=A&#8722;a1+an+1<em>A</em>&#8242;=<em>A</em>&#8722;<em>a</em>1&#8203;+<em>an</em>+1&#8203;</p><p>B&#8242;=B&#8722;n&#8901;a1+A&#8242;<em>B</em>&#8242;=<em>B</em>&#8722;<em>n</em>&#8901;<em>a</em>1&#8203;+<em>A</em>&#8242;</p><p><strong>O(1) per byte</strong>, regardless of window size. No need to re-sum all n bytes.</p><h3>Involutions vs. Rolling Updates</h3><p>Zobrist and rsync both achieve O(1) updates, but through different mechanisms:</p><p>TechniqueMathematical BasisUpdate OperationZobristXOR involution: a&#8853;a=0<em>a</em>&#8853;<em>a</em>=0Toggle element membershiprsyncAdditive sliding: A&#8242;=A&#8722;aold+anew<em>A</em>&#8242;=<em>A</em>&#8722;<em>aold</em>&#8203;+<em>anew</em>&#8203;Slide window by one position</p><p>Zobrist uses XOR&#8217;s self-inverse property&#8212;add and remove are the same operation.</p><p>rsync uses modular arithmetic&#8217;s linearity&#8212;you can subtract the old contribution and add the new one separately.</p><p>Both exploit structure to avoid recomputation. The algebra differs, but the principle is identical: <strong>incremental updates beat full recalculation</strong>.</p><div><hr></div><h2>The Counter-Example: Cryptographic Hashes</h2><p>SHA-256 is deliberately <strong>not</strong> invertible.</p><pre><code><code>h1 = sha256(data)
# There is no sha256_remove(h1, partial_data)
</code></code></pre><p>If you change one byte, you must rehash everything. That&#8217;s the point&#8212;cryptographic hashes are designed so you can&#8217;t deduce anything about the input from the output.</p><p>Hash TypeIncremental?Collision-resistant?Use CaseZobrist (XOR)&#10003; O(1)WeakGame trees, cachesRolling polynomial&#10003; O(1)ModerateString matchingSHA-256&#10007; O(n)StrongSecurity, integrityMerkle tree&#10003; O(log n)StrongBlockchain, git</p><p>Merkle trees are an interesting middle ground: O(log n) updates with cryptographic security. You sacrifice the O(1) of XOR but gain collision resistance.</p><div><hr></div><h2>Designing for Involutions</h2><p>When you need incremental hash updates, ask:</p><p><strong>1. What&#8217;s changing?</strong></p><ul><li><p>Single element: Zobrist-style XOR</p></li><li><p>Sliding window: Rolling hash</p></li><li><p>Tree structure: Merkle tree</p></li></ul><p><strong>2. How bad are collisions?</strong></p><ul><li><p>Recoverable (cache miss is fine): XOR</p></li><li><p>Needs verification: XOR + full comparison</p></li><li><p>Catastrophic (security): Merkle or rehash</p></li></ul><p><strong>3. What operations do you need?</strong></p><ul><li><p>Add only: Many options</p></li><li><p>Add and remove: Need involution</p></li><li><p>Order matters: Can&#8217;t use commutative XOR</p></li></ul><p>The involution property isn&#8217;t just an optimization. It determines what operations are even possible in O(1).</p><div><hr></div><h2>The Takeaway</h2><p>Zobrist hashing achieves O(1) updates because XOR is an involution&#8212;its own inverse.</p><p><strong>Adding and removing are the same operation.</strong> Move a piece? XOR out the old square, XOR in the new square. The hash updates without knowing anything about the other 62 squares.</p><p>This single property&#8212;f(f(x))=x<em>f</em>(<em>f</em>(<em>x</em>))=<em>x</em>&#8212;enables:</p><ul><li><p>Chess engines to cache millions of positions</p></li><li><p>Distributed systems to merge state without coordination</p></li><li><p>Streaming algorithms to maintain hashes over sliding windows</p></li></ul><p>The involution came first. The algorithms followed.</p><p>When you need incremental updates, don&#8217;t reach for clever data structures.</p><p>Reach for the algebra.</p><div><hr></div><p><em>See also: <a href="https://softwarebits.substack.com/p/the-one-property-that-makes-flashattention">Associativity: The One Property That Makes FlashAttention Possible</a></em></p><p><em>Full article with interactive demo: <a href="https://ttsugriy.github.io/perf-bits/involutions.html">ttsugriy.github.io/perf-bits/involutions.html</a></em></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><h2>Further Reading</h2><ul><li><p><a href="https://research.cs.wisc.edu/techreports/1970/TR88.pdf">Zobrist, &#8220;A New Hashing Method with Application for Game Playing&#8221; (1970)</a> &#8212; The original paper</p></li><li><p><a href="https://www.chessprogramming.org/Zobrist_Hashing">Chessprogramming Wiki: Zobrist Hashing</a> &#8212; Comprehensive reference</p></li><li><p><a href="https://rsync.samba.org/tech_report/">Tridgell &amp; Mackerras, &#8220;The rsync Algorithm&#8221; (1996)</a> &#8212; Efficient file synchronization</p></li><li><p><a href="https://hal.inria.fr/inria-00609399/document">Shapiro et al., &#8220;Conflict-free Replicated Data Types&#8221; (2011)</a> &#8212; CRDTs and commutative operations</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Sparsity: The License to Skip]]></title><description><![CDATA[Why ignoring most of your neural network is the key to efficiency]]></description><link>https://softwarebits.substack.com/p/sparsity-the-license-to-skip</link><guid isPermaLink="false">https://softwarebits.substack.com/p/sparsity-the-license-to-skip</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Wed, 07 Jan 2026 18:02:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!wUCB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><em><strong>&#128214; For the best reading experience with properly rendered equations, <a href="https://ttsugriy.github.io/perf-bits/sparsity.html">view this article on GitHub Pages</a>.</strong></em></p></blockquote><div><hr></div><p>Mixtral has 46.7 billion parameters but only uses 12.9 billion per token.</p><p>It activates 2 of its 8 expert networks, leaving 72% of its weights untouched on every forward pass. This should be wasteful. Instead, it matches Llama 2 70B while running at the cost of a 13B model.</p><p>The trick is a property called <strong>sparsity</strong>.</p><div><hr></div><h2><strong>The Property</strong></h2><p>A matrix is sparse if most of its elements are zero:</p><p><strong>sparsity = number of zeros / total elements</strong></p><p>A 90% sparse matrix has 9 zeros for every nonzero value.</p><p>Why should this help? Consider matrix-vector multiplication:</p><p><strong>y&#7522; = &#931;&#11388; W&#7522;&#11388; x&#11388;</strong></p><p>If W&#7522;&#11388; = 0, that term contributes nothing. Skip it.</p><p>With 90% sparsity, you skip 90% of the multiplications. 10x speedup, right?</p><p>Not quite. There&#8217;s a catch.</p><div><hr></div><h2><strong>The GPU Problem</strong></h2><p>Here&#8217;s the uncomfortable truth: <strong>GPUs don&#8217;t care about your zeros.</strong></p><p>GPUs achieve speed through parallelism&#8212;thousands of cores executing the same operation on different data. They&#8217;re optimized for dense, regular memory access patterns.</p><p>Random sparsity breaks this:</p><ul><li><p><strong>Memory access</strong>: Sparse formats store (row, column, value) tuples. Irregular access kills cache efficiency.</p></li><li><p><strong>Load balancing</strong>: Some rows might have 10 nonzeros, others 1000. Cores sit idle waiting for stragglers.</p></li><li><p><strong>Branching</strong>: Checking &#8220;is this zero?&#8221; adds overhead.</p></li></ul><p>The result: you typically need <strong>&gt;90% sparsity</strong> before unstructured sparse operations beat dense on a GPU. And even then, the gains are modest.</p><p><strong>The math says skip. The hardware says &#8220;I don&#8217;t know how.&#8221;</strong></p><div><hr></div><h2><strong>Structured Sparsity: Making Hardware Happy</strong></h2><p>The solution: constrain your sparsity pattern so hardware can exploit it.</p><h3><strong>N:M Sparsity</strong></h3><p>NVIDIA&#8217;s Ampere architecture introduced hardware support for <strong>2:4 sparsity</strong>: exactly 2 zeros in every group of 4 consecutive elements.</p><pre><code>[a, 0, b, 0] [c, 0, 0, d] [0, e, f, 0] ...</code></pre><p>This gives:</p><ul><li><p>50% sparsity (2 of 4 are zero)</p></li><li><p><strong>2x throughput</strong> on Tensor Cores</p></li><li><p>Minimal accuracy loss (networks adapt during training)</p></li></ul><p>The constraint is the feature: fixed positions mean predictable memory access, perfect load balancing, no branching.</p><h3><strong>Block Sparsity</strong></h3><p>Instead of individual zeros, zero out entire blocks:</p><pre><code>W = | A   0   B |
    | 0   C   0 |
    | D   0   E |</code></pre><p>Each block is either:</p><ul><li><p><strong>Dense</strong>: Use optimized GEMM</p></li><li><p><strong>Zero</strong>: Skip entirely</p></li></ul><p>Block sizes (32&#215;32, 64&#215;64) align with GPU tiles. The sparse indexing overhead amortizes across the block.</p><div><hr></div><h2><strong>Weight Sparsity: Pruning</strong></h2><p>Neural networks are massively overparameterized. Many weights contribute almost nothing.</p><p><strong>Magnitude pruning</strong>: Remove weights with smallest absolute values.</p><p>The surprising finding: you can often remove <strong>90% of weights</strong> with minimal accuracy loss.</p><h3><strong>The Lottery Ticket Hypothesis</strong></h3><p>Frankle &amp; Carlin (2019) showed something remarkable:</p><blockquote><p><em><strong>Dense networks contain sparse subnetworks (&#8221;winning tickets&#8221;) that&#8212;when trained in isolation from the same initialization&#8212;match the full network&#8217;s accuracy.</strong></em></p></blockquote><p>The interpretation: training a large network is really a search procedure. It finds the important subnetwork; the other weights were scaffolding.</p><h3><strong>Iterative Pruning</strong></h3><p>The practical recipe:</p><ol><li><p>Train to convergence</p></li><li><p>Prune smallest 20% of weights</p></li><li><p>Fine-tune</p></li><li><p>Repeat until desired sparsity</p></li></ol><p>Each round finds weights that <em>seemed</em> important but aren&#8217;t. Iterative pruning reaches higher sparsity than one-shot.</p><h3><strong>The Catch</strong></h3><p>Unstructured pruning creates random zeros&#8212;exactly what GPUs can&#8217;t exploit. Options:</p><ul><li><p>Accept the irregular memory access (works at very high sparsity)</p></li><li><p>Use structured pruning (remove entire neurons, attention heads, layers)</p></li><li><p>Prune to 2:4 patterns for hardware acceleration</p></li></ul><div><hr></div><h2><strong>Activation Sparsity: Free Zeros from ReLU</strong></h2><p>ReLU creates sparsity for free:</p><p><strong>ReLU(x) = max(0, x)</strong></p><p>Roughly half of activations become zero in typical networks. That&#8217;s 50% sparsity in every hidden layer.</p><p>But this sparsity is <strong>dynamic</strong>&#8212;you don&#8217;t know which values are zero until you compute them. GPUs still do the full computation, then throw away negatives.</p><p>Research directions:</p><ul><li><p><strong>Predictive gating</strong>: Predict which neurons will be zero <em>before</em> computing them</p></li><li><p><strong>Top-k activation</strong>: Only keep the k largest activations</p></li><li><p><strong>Dynamic sparse training</strong>: Skip provably-zero computations</p></li></ul><p>These are active research areas but not yet mainstream in production.</p><div><hr></div><h2><strong>Mixture of Experts: Conditional Computation</strong></h2><p>Here&#8217;s the most elegant form of sparsity: <strong>don&#8217;t decide which weights are zero&#8212;decide which weights to use per input.</strong></p><p>A Mixture of Experts layer:</p><p><strong>y = &#931;&#7522; G(x)&#7522; &#183; E&#7522;(x)</strong></p><p>where:</p><ul><li><p>E&#8321;, E&#8322;, &#8230;, E&#8345; are N &#8220;expert&#8221; networks (typically MLPs)</p></li><li><p>G(x) is a gating/routing function</p></li><li><p>G(x) is sparse: only top-k experts get nonzero weights</p></li></ul><p>With 8 experts and top-2 routing:</p><ul><li><p>Each token activates only 2 experts</p></li><li><p>75% of expert parameters are skipped per token</p></li><li><p>But total model capacity is 8x larger</p></li></ul><p><strong>This is parameter sparsity at the architecture level.</strong></p><h3><strong>Why MoE Works</strong></h3><p>Different inputs need different computations.</p><ul><li><p>&#8220;The cat sat on the mat&#8221; &#8594; language experts</p></li><li><p>&#8220;&#8747; x&#178; dx = x&#179;/3 + C&#8221; &#8594; math experts</p></li><li><p>deff&#8734;():<em>deff</em>&#8734;(): &#8594; code experts</p></li></ul><p>Instead of one network that handles everything, you have specialists that activate on demand.</p><p>Research shows experts do specialize: different experts prefer different token types, topics, and patterns. The routing learns to match inputs to expertise.</p><h3><strong>MoE in Practice</strong></h3><p><strong>Switch Transformer (Google, 2021)</strong>: Simplified MoE with top-1 routing. Scaled to 1.6 trillion parameters.</p><p><strong>Mixtral 8x7B (Mistral, 2023)</strong>:</p><ul><li><p>8 experts per layer</p></li><li><p>Top-2 routing per token</p></li><li><p>46.7B total parameters</p></li><li><p>12.9B active per forward pass</p></li><li><p>Matches Llama 2 70B at 5x less compute</p></li></ul><p><strong>GPT-4</strong>: Reportedly uses MoE architecture.</p><p><strong>Gemini</strong>: Uses MoE.</p><p>The pattern is clear: frontier models use conditional computation.</p><div><hr></div><h2><strong>Sparse Attention</strong></h2><p>Full attention is O(n&#178;) for sequence length n. At 100K tokens, that&#8217;s 10 billion attention computations per layer.</p><p>Sparse attention reduces this by only attending to a subset of positions.</p><h3><strong>Sliding Window</strong></h3><p>Each position attends only to nearby positions:</p><pre><code>Position i attends to: [i-w, ..., i-1, i, i+1, ..., i+w]</code></pre><p>Complexity: O(n &#183; w) where w is window size.</p><p>This works because most relevant context is local. Long-range dependencies exist but are rarer.</p><h3><strong>Strided Patterns</strong></h3><p>Add periodic global attention:</p><pre><code>Position i attends to:
- Local: [i-w, ..., i+w]
- Global: [0, k, 2k, 3k, ...] for some stride k</code></pre><p>Captures both local detail and global structure.</p><h3><strong>The Reality Check</strong></h3><p>FlashAttention changed the calculus. By making exact attention memory-efficient, it reduced pressure for approximate sparse methods.</p><p>Modern LLMs typically use:</p><ul><li><p><strong>Short context</strong>: Full attention with FlashAttention</p></li><li><p><strong>Long context</strong>: Sliding window + some global tokens</p></li><li><p><strong>Very long context</strong>: Hierarchical or chunked approaches</p></li></ul><p>Sparse attention is less about compute savings and more about memory constraints at extreme sequence lengths.</p><div><hr></div><h2><strong>The Unifying Principle</strong></h2><p>All forms of sparsity share one insight:</p><p><strong>Not all computation is equally valuable. Skip the parts that don&#8217;t matter.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wUCB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wUCB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 424w, https://substackcdn.com/image/fetch/$s_!wUCB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 848w, https://substackcdn.com/image/fetch/$s_!wUCB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 1272w, https://substackcdn.com/image/fetch/$s_!wUCB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wUCB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png" width="1336" height="466" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/edcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:466,&quot;width&quot;:1336,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:82323,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183504501?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!wUCB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 424w, https://substackcdn.com/image/fetch/$s_!wUCB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 848w, https://substackcdn.com/image/fetch/$s_!wUCB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 1272w, https://substackcdn.com/image/fetch/$s_!wUCB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fedcfdc86-0cb9-44ca-93e2-8d2312394945_1336x466.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The challenge is always: <strong>turning mathematical sparsity into actual speedup</strong>.</p><p>The solution is always: <strong>structure</strong>. Align your sparsity with hardware.</p><div><hr></div><h2><strong>Why Sparsity Works At All</strong></h2><p>Why can you remove 90% of weights without destroying the model?</p><p><strong>Overparameterization</strong>: Neural networks have far more parameters than strictly necessary. This excess provides:</p><ul><li><p>Easier optimization (smoother loss landscape)</p></li><li><p>Implicit regularization</p></li><li><p>Robustness to initialization</p></li></ul><p>Once trained, much of this capacity is redundant.</p><p><strong>The Lottery Ticket View</strong>: Training is search. The dense network explores many possible subnetworks. Most are dead ends; one is the solution. Pruning removes the dead ends.</p><p><strong>The MoE View</strong>: Different inputs need different parameters. A dense network wastes capacity using the same weights for all inputs. Experts specialize, using total capacity more efficiently.</p><div><hr></div><h2><strong>The Takeaway</strong></h2><p>Sparsity is the mathematical license to skip computation.</p><p><strong>If W&#7522;&#11388; = 0 or unused, then skip W&#7522;&#11388; &#183; x&#11388;</strong></p><p>But hardware doesn&#8217;t exploit random zeros. Unstructured sparsity gives unstructured memory access, which GPUs hate.</p><p>The practical path:</p><ul><li><p><strong>2:4 structured sparsity</strong>: 2x speedup with hardware support</p></li><li><p><strong>Block sparsity</strong>: Dense blocks, sparse selection</p></li><li><p><strong>Mixture of Experts</strong>: Let the input decide what to compute</p></li></ul><p>The most powerful form isn&#8217;t pruning&#8212;it&#8217;s <strong>conditional computation</strong>. MoE achieves massive parameter counts with modest compute by activating only what&#8217;s needed.</p><p>This is why Mixtral matches models 5x its active compute. Having idle parameters isn&#8217;t waste&#8212;it&#8217;s the whole point. Different inputs use different parameters. No single forward pass needs them all.</p><p>Sparsity says: you don&#8217;t have to compute everything.<br>Structure says: here&#8217;s how to actually skip it.<br>MoE says: let the input decide what matters.</p><div><hr></div><p><em>Previous article: <strong><a href="https://ttsugriy.github.io/perf-bits/domain-transformations.html">Domain Transformations: The Art of Finding Easier Spaces</a></strong></em></p><div><hr></div><h2><strong>Further Reading</strong></h2><ul><li><p><strong><a href="https://arxiv.org/abs/1803.03635">Frankle &amp; Carlin, &#8220;The Lottery Ticket Hypothesis&#8221; (2019)</a></strong> &#8212; Sparse subnetworks from initialization</p></li><li><p><strong><a href="https://arxiv.org/abs/2101.03961">Fedus et al., &#8220;Switch Transformers&#8221; (2021)</a></strong> &#8212; Scaling MoE to trillions of parameters</p></li><li><p><strong><a href="https://arxiv.org/abs/2104.08378">NVIDIA, &#8220;Accelerating Sparse Deep Neural Networks&#8221; (2021)</a></strong> &#8212; 2:4 structured sparsity on Ampere</p></li><li><p><strong><a href="https://arxiv.org/abs/2401.04088">Jiang et al., &#8220;Mixtral of Experts&#8221; (2024)</a></strong> &#8212; State-of-the-art open MoE</p></li><li><p><strong><a href="https://arxiv.org/abs/2404.01847">Pool &amp; Yu, &#8220;Accelerating Transformer Pre-training with 2:4 Sparsity&#8221; (2024)</a></strong> &#8212; Training with structured sparsity</p></li></ul><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Domain Transformations: The Art of Finding Easier Spaces]]></title><description><![CDATA[Why logarithms prevent underflow, why Fourier speeds up convolutions, and how choosing the right space makes hard problems tractable]]></description><link>https://softwarebits.substack.com/p/domain-transformations-the-art-of</link><guid isPermaLink="false">https://softwarebits.substack.com/p/domain-transformations-the-art-of</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Mon, 05 Jan 2026 18:00:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!N9oB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p><em><strong>&#128214; For the best reading experience with properly rendered equations, <a href="https://ttsugriy.github.io/perf-bits/domain-transformations.html">view this article on GitHub Pages</a>.</strong></em></p></blockquote><div><hr></div><p>Here&#8217;s a trick that appears everywhere in numerical computing:</p><p><strong>Don&#8217;t solve the hard problem. Transform it into an easy one.</strong></p><p>Multiplying a thousand small probabilities? You&#8217;ll underflow to zero. But <em>add their logarithms</em>, and everything works.</p><p>Convolving two signals of length n? That&#8217;s O(n&#178;). But <em>multiply in Fourier space</em>, and it&#8217;s O(n log n).</p><p>These aren&#8217;t clever hacks. They&#8217;re instances of a general principle: <strong>the right domain makes computation tractable.</strong></p><div><hr></div><h2><strong>The Principle</strong></h2><p>A domain transformation moves computation from one space to another:</p><p><strong>Hard problem in Space A &#8594; transform &#8594; Easy problem in Space B</strong></p><p>The pattern:</p><ol><li><p>Transform input to the easier domain</p></li><li><p>Compute in that domain</p></li><li><p>Transform back (if needed)</p></li></ol><p>This is worthwhile when:</p><p><strong>cost(transform) + cost(easy computation) + cost(inverse) &lt; cost(hard computation)</strong></p><p>Often dramatically so.</p><div><hr></div><h2><strong>Logarithms: Multiplication to Addition</strong></h2><p>The most common domain transformation in ML.</p><h3><strong>The Problem</strong></h3><p>You&#8217;re computing the probability of a sequence:</p><p><strong>P(x&#8321;, x&#8322;, &#8230;, x&#8345;) = &#8719;&#7522; P(x&#7522; | x&lt;&#7522;)</strong></p><p>Each factor is less than 1. Multiply 1000 of them:</p><pre><code>&gt;&gt;&gt; 0.1 ** 1000
0.0  # Underflow</code></pre><p>The true answer isn&#8217;t zero&#8212;it&#8217;s just smaller than the smallest representable float.</p><h3><strong>The Solution</strong></h3><p>Work in log-space:</p><p><strong>log P = &#931;&#7522; log P(x&#7522; | x&lt;&#7522;)</strong></p><p>Multiplication becomes addition. Products of tiny numbers become sums of negative numbers.</p><pre><code>&gt;&gt;&gt; import math
&gt;&gt;&gt; 1000 * math.log(0.1)
-2302.58...  # No underflo</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!J8P1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!J8P1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 424w, https://substackcdn.com/image/fetch/$s_!J8P1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 848w, https://substackcdn.com/image/fetch/$s_!J8P1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 1272w, https://substackcdn.com/image/fetch/$s_!J8P1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!J8P1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png" width="1346" height="322" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:322,&quot;width&quot;:1346,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50119,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183304860?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!J8P1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 424w, https://substackcdn.com/image/fetch/$s_!J8P1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 848w, https://substackcdn.com/image/fetch/$s_!J8P1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 1272w, https://substackcdn.com/image/fetch/$s_!J8P1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb2cf7621-fcc2-46fb-8c26-e74a4acea4ab_1346x322.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This is why every language model outputs log-probabilities. Why Bayesian inference uses log-likelihoods. Why HMMs compute in log-space.</p><p><strong>Logarithms don&#8217;t just prevent underflow. They turn an unstable operation into a stable one.</strong></p><div><hr></div><h2><strong>The Log-Sum-Exp Trick</strong></h2><p>But what if you need to <em>add</em> probabilities, not multiply them?</p><p>For mutually exclusive events:</p><p><strong>P(A or B) = P(A) + P(B)</strong></p><p>In log-space, this becomes:</p><p><strong>log(e&#7491; + e&#7495;)</strong></p><p>where a = log P(A) and b = log P(B). This comes up constantly&#8212;marginalizing over hidden states in HMMs, summing over paths in CTC, computing partition functions.</p><h3><strong>The Problem</strong></h3><pre><code>&gt;&gt;&gt; import math
&gt;&gt;&gt; a, b = -1000, -1001
&gt;&gt;&gt; math.log(math.exp(a) + math.exp(b))
# math.exp(-1000) = 0.0 (underflow)
# Result: undefined</code></pre><p>Exponentiating large negative numbers underflows. We&#8217;re back where we started.</p><h3><strong>The Solution</strong></h3><p>Factor out the maximum:</p><p><strong>log(e&#7491; + e&#7495;) = max(a, b) + log(1 + e^(&#8722;|a&#8722;b|))</strong></p><p>The exponent &#8722;|a&#8722;b| is always &#8804; 0, so e^(&#8722;|a&#8722;b|) &#8804; 1. No overflow, and the underflowed term is added to 1, so we don&#8217;t lose precision.</p><pre><code>def log_sum_exp(a, b):
    max_val = max(a, b)
    return max_val + math.log(math.exp(a - max_val) + math.exp(b - max_val))</code></pre><p>For vectors:</p><p><strong>logsumexp(x) = max(x) + log &#931;&#7522; exp(x&#7522; &#8722; max(x))</strong></p><p>This is exactly what softmax uses internally:</p><p><strong>softmax(x)&#7522; = exp(x&#7522; &#8722; logsumexp(x))</strong></p><p><strong>The log-sum-exp trick keeps computation in log-space while handling addition.</strong></p><div><hr></div><h2><strong>Fourier Transform: Convolution to Multiplication</strong></h2><p>Another profound domain transformation.</p><h3><strong>The Problem</strong></h3><p>Convolution in the spatial domain:</p><p><strong>(f &#8727; g)[n] = &#931;&#8344; f[m] &#183; g[n&#8722;m]</strong></p><p>For signals of length N, this is O(N&#178;)&#8212;N outputs, each summing over N terms.</p><h3><strong>The Convolution Theorem</strong></h3><p>The Fourier transform has a remarkable property:</p><p><strong>&#8497;(f &#8727; g) = &#8497;(f) &#183; &#8497;(g)</strong></p><p>Convolution in space = multiplication in frequency.</p><p>The algorithm:</p><pre><code>def fast_convolve(f, g):
    F_f = fft(f)        # O(n log n)
    F_g = fft(g)        # O(n log n)
    F_result = F_f * F_g  # O(n) - element-wise
    return ifft(F_result) # O(n log n)</code></pre><p>Total: O(n log n) instead of O(n&#178;).</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!phBn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!phBn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 424w, https://substackcdn.com/image/fetch/$s_!phBn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 848w, https://substackcdn.com/image/fetch/$s_!phBn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 1272w, https://substackcdn.com/image/fetch/$s_!phBn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!phBn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png" width="1352" height="320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:320,&quot;width&quot;:1352,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:41250,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183304860?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!phBn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 424w, https://substackcdn.com/image/fetch/$s_!phBn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 848w, https://substackcdn.com/image/fetch/$s_!phBn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 1272w, https://substackcdn.com/image/fetch/$s_!phBn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f2d2aa3-f633-4a33-8943-bf5f5f9f5ad6_1352x320.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>For large kernels, the transform cost is negligible. For small kernels (3&#215;3, 5&#215;5), direct convolution is faster&#8212;the transform overhead dominates.</p><p>In practice, modern deep learning frameworks use highly optimized direct convolution (cuDNN) even for medium-sized kernels, because GPU implementations are so fast. But FFT-based convolution remains important in signal processing and for very large kernels.</p><div><hr></div><h2><strong>Why Transformers Don&#8217;t Use FFT</strong></h2><p>Attention looks like it should benefit from FFT:</p><p><strong>Attention = softmax(QK&#7488;)V</strong></p><p>The QK&#7488; multiplication is O(n&#178;d) for sequence length n.</p><p>But there&#8217;s a catch: <strong>attention isn&#8217;t convolution</strong>.</p><p>Convolution is translation-equivariant&#8212;shift the input, shift the output. The kernel slides uniformly.</p><p>Attention is content-based&#8212;each position attends differently based on <em>what&#8217;s there</em>, not where it is.</p><p>The Fourier transform exploits the structure of convolution. Attention doesn&#8217;t have that structure.</p><p>(Some efficient attention methods like Performers and Linear Attention do use kernel approximations&#8212;but they&#8217;re approximating attention, not computing it exactly via FFT.)</p><div><hr></div><h2><strong>Embeddings: Sparse to Dense</strong></h2><p>A different kind of domain transformation.</p><h3><strong>The Problem</strong></h3><p>Words are categorical&#8212;there&#8217;s no natural arithmetic on them.</p><p>&#8220;king&#8221; - &#8220;man&#8221; + &#8220;woman&#8221; = ???</p><p>With one-hot encoding, words are orthogonal vectors in a 50,000-dimensional space. No similarity, no structure.</p><h3><strong>The Solution</strong></h3><p>Learn a dense embedding:</p><p><strong>word &#8594; embed &#8594; &#8477;&#7496;</strong></p><p>Now:</p><p><strong>embed(&#8221;king&#8221;) &#8722; embed(&#8221;man&#8221;) + embed(&#8221;woman&#8221;) &#8776; embed(&#8221;queen&#8221;)</strong></p><p>The transformation creates structure that wasn&#8217;t there before.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Cskj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Cskj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 424w, https://substackcdn.com/image/fetch/$s_!Cskj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 848w, https://substackcdn.com/image/fetch/$s_!Cskj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 1272w, https://substackcdn.com/image/fetch/$s_!Cskj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Cskj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png" width="1284" height="226" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:226,&quot;width&quot;:1284,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36761,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183304860?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Cskj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 424w, https://substackcdn.com/image/fetch/$s_!Cskj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 848w, https://substackcdn.com/image/fetch/$s_!Cskj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 1272w, https://substackcdn.com/image/fetch/$s_!Cskj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2bd557a0-75b1-44e6-8a56-5581ba18dfbb_1284x226.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>This isn&#8217;t just dimensionality reduction. It&#8217;s finding a space where the hard problem (word relationships) becomes easy (vector arithmetic).</p><div><hr></div><h2><strong>The Kernel Trick: Linear in a Lifted Space</strong></h2><p>Sometimes the solution isn&#8217;t a lower-dimensional space&#8212;it&#8217;s a higher one.</p><h3><strong>The Problem</strong></h3><p>Data isn&#8217;t linearly separable:</p><p>Copy</p><pre><code>         &#9675;   &#9675;   &#9675;
       &#9675;           &#9675;
     &#9675;    &#9679;  &#9679;  &#9679;    &#9675;
     &#9675;    &#9679;  &#9679;  &#9679;    &#9675;
     &#9675;    &#9679;  &#9679;  &#9679;    &#9675;
       &#9675;           &#9675;
         &#9675;   &#9675;   &#9675;

  No linear boundary separates &#9679; from &#9675;.
</code></pre><p>The inner class is surrounded. No line can divide them.</p><h3><strong>The Solution</strong></h3><p>Map to a higher-dimensional space where it <em>is</em> linearly separable:</p><p><strong>&#966;: &#8477;&#7496; &#8594; &#8477;&#7472; where D &gt; d</strong></p><p>For the concentric pattern, add just one feature: z = x&#178; + y&#178; (squared distance from center). Now the inner class has small z, the outer class has large z. A horizontal plane separates them.</p><p>The kernel trick computes dot products in the lifted space <em>without explicitly computing the transformation</em>:</p><p><strong>K(x, y) = &#10216;&#966;(x), &#966;(y)&#10217;</strong></p><p>For the RBF kernel:</p><p><strong>K(x, y) = exp(&#8722;&#8214;x &#8722; y&#8214;&#178; / 2&#963;&#178;)</strong></p><p>This implicitly works in an <em>infinite</em>-dimensional space, but you never compute it directly.</p><p><strong>The kernel trick is a domain transformation you don&#8217;t have to pay for.</strong></p><div><hr></div><h2><strong>Spectral Graph Methods</strong></h2><p>Graph Laplacians transform graph problems into linear algebra.</p><h3><strong>The Problem</strong></h3><p>Clustering nodes in a graph based on connectivity. Community detection. Graph partitioning.</p><p>These seem like discrete, combinatorial problems.</p><h3><strong>The Solution</strong></h3><p>Compute the graph Laplacian:</p><p><strong>L = D &#8722; A</strong></p><p>where D is the degree matrix and A is the adjacency matrix.</p><p>The eigenvectors of L embed nodes into Euclidean space:</p><p><strong>node&#7522; &#8594; (v&#8321;(i), v&#8322;(i), &#8230;, v&#8342;(i))</strong></p><p>In this space, k-means clustering solves the graph partitioning problem.</p><p>A discrete optimization problem becomes a tractable eigenvector computation.</p><div><hr></div><h2><strong>Numerical Stability: A Recurring Theme</strong></h2><p>Many domain transformations exist for numerical reasons:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!N9oB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!N9oB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 424w, https://substackcdn.com/image/fetch/$s_!N9oB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 848w, https://substackcdn.com/image/fetch/$s_!N9oB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 1272w, https://substackcdn.com/image/fetch/$s_!N9oB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!N9oB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png" width="1384" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:390,&quot;width&quot;:1384,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:63981,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183304860?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!N9oB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 424w, https://substackcdn.com/image/fetch/$s_!N9oB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 848w, https://substackcdn.com/image/fetch/$s_!N9oB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 1272w, https://substackcdn.com/image/fetch/$s_!N9oB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5ff3399-1e5d-40ce-a496-aad2da7216ab_1384x390.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Each is a domain transformation that trades mathematical equivalence for numerical stability.</p><p><strong>Equivalent in exact arithmetic. Different in floating-point.</strong></p><div><hr></div><h2><strong>When to Look for a Transform</strong></h2><p>The pattern recurs:</p><ol><li><p><strong>Multiplication &#8594; Addition</strong>: Use logarithms</p></li><li><p><strong>Convolution &#8594; Element-wise</strong>: Use Fourier</p></li><li><p><strong>Non-linear &#8594; Linear</strong>: Use kernel methods</p></li><li><p><strong>Discrete &#8594; Continuous</strong>: Use spectral methods</p></li><li><p><strong>High-dimensional sparse &#8594; Low-dimensional dense</strong>: Use embeddings</p></li></ol><p>The skill is recognizing when your hard problem has an easier dual.</p><p>Questions to ask:</p><ul><li><p><strong>What&#8217;s expensive or unstable?</strong> Products of small numbers? Convolution? Non-linear optimization?</p></li><li><p><strong>Is there a standard transform?</strong> Log, Fourier, Laplace, embeddings?</p></li><li><p><strong>Does the transform preserve what you need?</strong> Some transforms lose information.</p></li><li><p><strong>Is the round-trip worth it?</strong> Transform cost + easy computation &lt; hard computation?</p></li></ul><div><hr></div><h2><strong>The Meta-Lesson</strong></h2><p>The previous articles in this series covered:</p><ul><li><p><strong>Associativity</strong>: Enables chunking, parallelization, streaming</p></li><li><p><strong>Commutativity</strong>: Enables reordering, permutation invariance</p></li><li><p><strong>Linearity</strong>: Enables batching, gradient accumulation</p></li></ul><p>Domain transformations are different. They&#8217;re not about properties of operations&#8212;they&#8217;re about <strong>choosing the right space</strong>.</p><p>But the connection is deep: transforms often work because they reveal simpler structure.</p><ul><li><p>Fourier reveals that convolution is <em>pointwise</em> in frequency space</p></li><li><p>Logarithms reveal that multiplication is <em>additive</em> in log space</p></li><li><p>Embeddings reveal that semantic relationships are approximately <em>linear</em> in embedding space</p></li></ul><p><strong>The transform finds a space where the problem has the structure you need.</strong></p><div><hr></div><h2><strong>The Takeaway</strong></h2><p>Don&#8217;t solve the hard problem directly. Ask: <strong>is there an easier space?</strong></p><ul><li><p>Products underflow &#8594; work in log space</p></li><li><p>Convolution is O(n&#178;) &#8594; work in frequency space</p></li><li><p>Data isn&#8217;t linearly separable &#8594; work in kernel space</p></li></ul><p>The transform might cost something. But if the computation in the new space is dramatically cheaper, you win.</p><p>This is computational judo: using structure to redirect effort. The best algorithms don&#8217;t fight the problem&#8212;they find the space where the problem solves itself.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>See also:</em></p><ul><li><p><em><strong><a href="https://ttsugriy.github.io/perf-bits/associativity.html">The One Property That Makes FlashAttention Possible</a></strong> &#8212; Associativity</em></p></li><li><p><em><strong><a href="https://ttsugriy.github.io/perf-bits/commutativity.html">Why Transformers Need Positional Encodings</a></strong> &#8212; Commutativity</em></p></li><li><p><em><strong><a href="https://ttsugriy.github.io/perf-bits/linearity.html">Why Batching Works</a></strong> &#8212; Linearity</em></p></li></ul><div><hr></div><h2><strong>Further Reading</strong></h2><ul><li><p><strong><a href="http://numerical.recipes/">Numerical Recipes, Ch. 12-13</a></strong> &#8212; FFT and spectral methods</p></li><li><p><strong><a href="https://probml.github.io/pml-book/">Murphy, &#8220;Probabilistic Machine Learning&#8221;</a></strong> &#8212; Log-space computation throughout</p></li><li><p><strong><a href="https://mitpress.mit.edu/9780262536578/">Scholkopf &amp; Smola, &#8220;Learning with Kernels&#8221;</a></strong> &#8212; Kernel methods and feature spaces</p></li><li><p><strong><a href="https://arxiv.org/abs/0711.0189">Von Luxburg, &#8220;A Tutorial on Spectral Clustering&#8221;</a></strong> &#8212; Graph Laplacians and embeddings</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Beyond Snowflake: A Problem-Solver’s Guide to Distributed ID Generation]]></title><description><![CDATA[How to discover solutions, not just memorize them.]]></description><link>https://softwarebits.substack.com/p/beyond-snowflake-a-problem-solvers</link><guid isPermaLink="false">https://softwarebits.substack.com/p/beyond-snowflake-a-problem-solvers</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sun, 04 Jan 2026 19:04:53 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!gGdZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In 1945, mathematician George Polya published <em>How to Solve It</em>, a slim book that became one of the most influential works on problem-solving ever written. His central insight was deceptively simple: most hard problems are solved not through brilliance, but by recognizing their connection to problems already solved.</p><p>One of his key heuristics: <strong>&#8220;Do you know a related problem? Here is a problem related to yours and solved before. Could you use it?&#8221;</strong></p><p>In the 1990s, Japanese engineer Eiji Nakatsu faced a difficult challenge: the Shinkansen bullet train created deafening sonic booms when entering tunnels at high speed. The solution came not from aerospace engineering, but from birdwatching. Nakatsu noticed that kingfishers dive from air into water with barely a splash&#8212;a transition between mediums, just like a train entering a tunnel. By reshaping the train&#8217;s nose to mimic the kingfisher&#8217;s beak, he eliminated the sonic boom and improved efficiency.</p><p>This article applies that same heuristic to a classic distributed systems challenge: generating unique IDs at scale.</p><p>The standard answers&#8212;UUID, database sequences, Snowflake&#8212;are well-known. But there&#8217;s a deeper design space that most discussions miss. To find it, we&#8217;ll ask Polya&#8217;s question: <em>What related problem has been solved before?</em></p><p>The answer, it turns out, has been shipping with your operating system for decades.</p><div><hr></div><h2><strong>Step 1: Understand the Problem</strong></h2><p>Polya&#8217;s first step is to understand the problem completely before attempting solutions. What is the unknown? What are the constraints?</p><h3><strong>What Is The Unknown?</strong></h3><p>We need a function that returns identifiers with this property: no two calls, anywhere in a distributed system, ever return the same value.</p><h3><strong>What Are The Constraints?</strong></h3><p>Every ID generation system makes trade-offs across these dimensions:</p><p><strong>ConstraintQuestionUniqueness</strong>Can two nodes ever generate the same ID?<strong>Ordering</strong>Do IDs reflect temporal or causal order?<strong>Size</strong>How many bits? (Affects storage, indexing, transmission)<strong>Throughput</strong>How many IDs per second per node?<strong>Coordination</strong>How much communication between nodes?<strong>Availability</strong>Can we generate IDs during network partitions?</p><p>Most systems need uniqueness. Everything else is negotiable&#8212;but every choice has consequences.</p><h3><strong>Have We Seen This Problem Before?</strong></h3><p>The standard solutions are well-documented:</p><p><strong>UUIDs</strong> offer zero coordination&#8212;any node generates 128 random bits independently. But they&#8217;re large, unsortable, and their randomness destroys B-tree locality. Every insert lands on a random leaf page.</p><p><strong>Database auto-increment</strong> gives you perfect ordering and minimal size, but requires a round-trip to a central database for every ID. It&#8217;s a throughput bottleneck and a single point of failure.</p><p><strong>Twitter&#8217;s Snowflake</strong> hit a sweet spot: 64 bits, time-sortable, high throughput, and minimal coordination (just a one-time machine ID assignment). Its structure&#8212;41 bits of timestamp, 10 bits of machine ID, 12 bits of sequence&#8212;became the template everyone copies.</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                    Snowflake ID (64 bits)                   &#9474;
&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
&#9474; 1 bit   &#9474; 41 bits           &#9474; 10 bits     &#9474; 12 bits         &#9474;
&#9474; (sign)  &#9474; (timestamp ms)    &#9474; (machine)   &#9474; (sequence)      &#9474;
&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
&#9474; ~69 years &#9474; 1024 machines &#9474; 4096 IDs/ms/machine             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>Snowflake is excellent. But is it the only answer? Is there a deeper pattern we&#8217;re missing?</p><p>This is where most discussions stop. We won&#8217;t.</p><div><hr></div><h2><strong>Step 2: Devise a Plan &#8212; Finding the Related Problem</strong></h2><p>Polya&#8217;s second step is to devise a plan. His most powerful heuristic here: <strong>&#8220;Do you know a related problem?&#8221;</strong></p><p>Let&#8217;s think about what we&#8217;re really doing. We need to:</p><ul><li><p>Hand out unique resources (IDs)</p></li><li><p>To concurrent requesters (distributed services)</p></li><li><p>With minimal coordination (for performance)</p></li></ul><p>Where else have we seen this exact structure?</p><h3><strong>The Leap: Memory Allocation</strong></h3><p>Memory allocators have been solving a structurally identical problem since the 1980s:</p><ul><li><p>Hand out unique resources (<strong>memory addresses</strong>)</p></li><li><p>To concurrent requesters (<strong>threads</strong>)</p></li><li><p>With minimal coordination (<strong>for performance</strong>)</p></li></ul><p>The mapping is direct:</p><p><strong>ID GenerationMemory Allocation</strong>Unique IDUnique memory addressDistributed serviceThreadCentral coordinatorGlobal heapNetwork round-tripLock acquisition</p><p>Could we use this? Let&#8217;s look at how memory allocators solved it.</p><h3><strong>TCMalloc&#8217;s Solution: Hierarchical Allocation</strong></h3><p>Google&#8217;s tcmalloc uses a three-tier hierarchy:</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                         tcmalloc                            &#9474;
&#9474;                                                             &#9474;
&#9474;  &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;  &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;  &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;          &#9474;
&#9474;  &#9474;Thread Cache &#9474;  &#9474;Thread Cache &#9474;  &#9474;Thread Cache &#9474;  ...     &#9474;
&#9474;  &#9474;  (no locks) &#9474;  &#9474;  (no locks) &#9474;  &#9474;  (no locks) &#9474;          &#9474;
&#9474;  &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;  &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;  &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;          &#9474;
&#9474;         &#9474;                &#9474;                &#9474;                 &#9474;
&#9474;         &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;                 &#9474;
&#9474;                          &#9660;                                  &#9474;
&#9474;                  &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;                          &#9474;
&#9474;                  &#9474; Central Free  &#9474;                          &#9474;
&#9474;                  &#9474;    Lists      &#9474;  &#8592; One lock per          &#9474;
&#9474;                  &#9474; (per size)    &#9474;    size class            &#9474;
&#9474;                  &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;                          &#9474;
&#9474;                          &#9474;                                  &#9474;
&#9474;                          &#9660;                                  &#9474;
&#9474;                  &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;                          &#9474;
&#9474;                  &#9474;  Page Heap    &#9474;  &#8592; Global, but           &#9474;
&#9474;                  &#9474;               &#9474;    rarely touched        &#9474;
&#9474;                  &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;                          &#9474;
&#9474;                                                             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>The key insight: <strong>push work to the edges, coordinate only when necessary</strong>.</p><ul><li><p><strong>Thread caches</strong> handle most allocations with zero synchronization. Each thread has its own pool of objects.</p></li><li><p><strong>Central lists</strong> refill thread caches when they&#8217;re empty. This requires locks, but happens infrequently.</p></li><li><p><strong>Page heap</strong> provides bulk memory to central lists. Even more infrequent.</p></li></ul><p>The documentation states it plainly: &#8220;when following this fast path, TCMalloc acquires no locks at all.&#8221;</p><p>This is <strong>amortized coordination</strong>. You pay the cost of synchronization once per N allocations, where N is your cache size. For memory allocators, N might be hundreds of objects. For ID generators, N can be thousands.</p><h3><strong>Extracting the Transferable Principle</strong></h3><p>The pattern generalizes beyond memory:</p><p><strong>Memory AllocatorID Allocator</strong>Thread cacheLocal ID bufferArena/Central listRegional allocatorPage heap/mmapRoot coordinatorSize classID rangeObjectIndividual ID</p><p>We&#8217;ve found our related problem. Now let&#8217;s apply it.</p><div><hr></div><h2><strong>Step 3: Carry Out the Plan &#8212; Applying the Pattern</strong></h2><p>With the memory allocator insight in hand, we can derive multiple solutions by applying the same principles.</p><h3><strong>Solution 1: Slab Allocation</strong></h3><p>Instead of generating IDs one at a time (Snowflake) or from a central source (database), we <strong>pre-allocate ranges</strong>:</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                    Slab-Based ID Allocation                 &#9474;
&#9474;                                                             &#9474;
&#9474;   Central Database:                                         &#9474;
&#9474;   &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;   &#9474;
&#9474;   &#9474; business_tag &#9474; max_allocated &#9474; step_size &#9474;          &#9474;   &#9474;
&#9474;   &#9474; orders       &#9474; 50,000        &#9474; 10,000    &#9474;          &#9474;   &#9474;
&#9474;   &#9474; users        &#9474; 1,000,000     &#9474; 50,000    &#9474;          &#9474;   &#9474;
&#9474;   &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;   &#9474;
&#9474;                          &#9474;                                  &#9474;
&#9474;              Request: &#8220;Give me a range&#8221;                     &#9474;
&#9474;              Response: [50000, 60000)                       &#9474;
&#9474;                          &#9474;                                  &#9474;
&#9474;         &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;                 &#9474;
&#9474;         &#9660;                &#9660;                &#9660;                 &#9474;
&#9474;   &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;           &#9474;
&#9474;   &#9474; Service A &#9474;    &#9474; Service B &#9474;    &#9474; Service C &#9474;           &#9474;
&#9474;   &#9474;[50K, 60K) &#9474;    &#9474;[60K, 70K) &#9474;    &#9474;[70K, 80K) &#9474;           &#9474;
&#9474;   &#9474; pos: 50847&#9474;    &#9474; pos: 62103&#9474;    &#9474; pos: 70002&#9474;           &#9474;
&#9474;   &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;           &#9474;
&#9474;                                                             &#9474;
&#9474;   Local allocation: just increment a counter                &#9474;
&#9474;                                                             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>Each service instance:</p><ol><li><p>Requests a range from the central database (one network call)</p></li><li><p>Hands out IDs from that range locally (zero network calls, just counter++<em>counter</em>++)</p></li><li><p>When exhausted, requests another range</p></li></ol><p>If your range size is 10,000, you&#8217;ve reduced coordination by 10,000&#215;.</p><h4><strong>Production Example: Meituan Leaf</strong></h4><p>Meituan, China&#8217;s largest food delivery platform, open-sourced their ID generator called <strong>Leaf</strong>. Its &#8220;segment mode&#8221; implements exactly this pattern, with a crucial optimization: <strong>double buffering</strong>.</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                    Leaf Service Instance                    &#9474;
&#9474;                                                             &#9474;
&#9474;   &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;        &#9474;
&#9474;   &#9474;     Segment A       &#9474;    &#9474;     Segment B       &#9474;        &#9474;
&#9474;   &#9474;   [100000, 110000)  &#9474;    &#9474;   [110000, 120000)  &#9474;        &#9474;
&#9474;   &#9474;   current: 108,934  &#9474;    &#9474;   (ready, waiting)  &#9474;        &#9474;
&#9474;   &#9474;   &#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9617;&#9617;&#9617;&#9617;   &#9474;    &#9474;   &#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;&#9617;  &#9474;        &#9474;
&#9474;   &#9474;      ACTIVE         &#9474;    &#9474;      STANDBY        &#9474;        &#9474;
&#9474;   &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;        &#9474;
&#9474;                                                             &#9474;
&#9474;   When Segment A reaches 10% remaining:                     &#9474;
&#9474;     &#8594; Background thread fetches next range into Segment B   &#9474;
&#9474;                                                             &#9474;
&#9474;   When Segment A exhausted:                                 &#9474;
&#9474;     &#8594; Atomic switch to Segment B (already loaded!)          &#9474;
&#9474;     &#8594; Background thread now loads Segment A                 &#9474;
&#9474;                                                             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>This eliminates latency spikes at range boundaries. The prefetching is triggered proactively&#8212;Leaf starts loading the next segment when the current one drops below 10% capacity.</p><p>Sound familiar? It&#8217;s exactly how CPU prefetching works. Or how a streaming service buffers the next video segment while you watch the current one. Or how jemalloc returns memory to central lists before completely exhausting local caches.</p><p>The principle is universal: <strong>anticipate needs, prefetch resources, smooth out latency</strong>.</p><h4><strong>Trade-offs</strong></h4><p><strong>Wins:</strong></p><ul><li><p>Near-zero coordination cost (amortized to 1/N)</p></li><li><p>Sequential IDs within each slab (excellent B-tree locality)</p></li><li><p>No clock dependency (pure counters)</p></li><li><p>Simple mental model</p></li></ul><p><strong>Loses:</strong></p><ul><li><p>No global time ordering (slab A might be issued before slab B, but contain higher IDs)</p></li><li><p>Wasted IDs on crash (uncommitted portion of slab is lost)</p></li><li><p>Central coordinator dependency (though it&#8217;s touched rarely)</p></li></ul><div><hr></div><h3><strong>Solution 2: Hierarchical Allocation</strong></h3><p>What if the central coordinator becomes a bottleneck? Or a single point of failure?</p><p>Here&#8217;s where we can go deeper than existing systems. Memory allocators don&#8217;t just have two tiers&#8212;tcmalloc has three (thread cache &#8594; central &#8594; page heap), and the kernel has more below that (page allocator &#8594; buddy system &#8594; physical memory).</p><p>We can apply the same hierarchy to ID allocation.</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                  Hierarchical ID Allocation                 &#9474;
&#9474;                                                             &#9474;
&#9474;                    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;                      &#9474;
&#9474;                    &#9474; Root Allocator  &#9474;                      &#9474;
&#9474;                    &#9474;  [0, 2^64)      &#9474;                      &#9474;
&#9474;                    &#9474; Grants: 2^40    &#9474;                      &#9474;
&#9474;                    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;                      &#9474;
&#9474;                             &#9474;                               &#9474;
&#9474;          &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;            &#9474;
&#9474;          &#9660;                  &#9660;                  &#9660;            &#9474;
&#9474;   &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;     &#9474;
&#9474;   &#9474; Regional US &#9474;    &#9474; Regional EU &#9474;    &#9474;Regional APAC&#9474;     &#9474;
&#9474;   &#9474; [0, 2^40)   &#9474;    &#9474;[2^40, 2^41) &#9474;    &#9474;[2^41,3&#215;2^40)&#9474;     &#9474;
&#9474;   &#9474; Grants: 2^24&#9474;    &#9474; Grants: 2^24&#9474;    &#9474; Grants: 2^24&#9474;     &#9474;
&#9474;   &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;     &#9474;
&#9474;          &#9474;                  &#9474;                  &#9474;            &#9474;
&#9474;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;           ...                ...           &#9474;
&#9474;    &#9660;     &#9660;     &#9660;                                            &#9474;
&#9474;  &#9484;&#9472;&#9472;&#9472;&#9488; &#9484;&#9472;&#9472;&#9472;&#9488; &#9484;&#9472;&#9472;&#9472;&#9488;                                          &#9474;
&#9474;  &#9474;L1 &#9474; &#9474;L2 &#9474; &#9474;L3 &#9474;   Leaf nodes (app instances)             &#9474;
&#9474;  &#9492;&#9472;&#9472;&#9472;&#9496; &#9492;&#9472;&#9472;&#9472;&#9496; &#9492;&#9472;&#9472;&#9472;&#9496;   Grants: 2^12 (4096 IDs)                &#9474;
&#9474;                                                             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>This mirrors exactly how ma&#8810;oc<em>ma</em>&#8810;<em>oc</em> works:</p><ul><li><p>Your application calls ma&#8810;oc()<em>ma</em>&#8810;<em>oc</em>() &#8594; thread-local fast path</p></li><li><p>Thread cache exhausted &#8594; refill from arena</p></li><li><p>Arena exhausted &#8594; mmap()<em>mmap</em>() or sbrk()<em>sbrk</em>() to kernel</p></li><li><p>Kernel &#8594; physical page allocator</p></li></ul><p>Each tier handles progressively larger allocations at progressively lower frequencies.</p><h4><strong>Request Frequency Analysis</strong></h4><p>Let&#8217;s do the math. Assume:</p><ul><li><p>Leaf nodes get 4,096 IDs per range (2^12)</p></li><li><p>Regional nodes get 16 million IDs per range (2^24)</p></li><li><p>Root holds the full 64-bit space</p></li></ul><p>If your system generates 1 million IDs per second globally:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QjE-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QjE-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 424w, https://substackcdn.com/image/fetch/$s_!QjE-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 848w, https://substackcdn.com/image/fetch/$s_!QjE-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 1272w, https://substackcdn.com/image/fetch/$s_!QjE-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QjE-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png" width="1188" height="552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:552,&quot;width&quot;:1188,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85658,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183416903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QjE-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 424w, https://substackcdn.com/image/fetch/$s_!QjE-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 848w, https://substackcdn.com/image/fetch/$s_!QjE-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 1272w, https://substackcdn.com/image/fetch/$s_!QjE-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc3dd3fd-98e8-400e-8ef1-5b449df8be63_1188x552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The root allocator is essentially write-once infrastructure. You could run it on a napkin.</p><h4><strong>Failure Isolation</strong></h4><p>This hierarchy provides graceful degradation:</p><p><strong>Root dies:</strong></p><ul><li><p>Regionals continue with their pre-allocated ranges</p></li><li><p>At 2^40 IDs per regional, that&#8217;s years of runway</p></li><li><p>Plenty of time to restore from backup</p></li></ul><p><strong>Regional dies:</strong></p><ul><li><p>Leaf nodes continue with their local buffers</p></li><li><p>Leaves can failover to sibling regional</p></li><li><p>Or escalate directly to root (emergency path)</p></li></ul><p><strong>Leaf dies:</strong></p><ul><li><p>Only loses its local buffer (4K IDs max)</p></li><li><p>Other leaves completely unaffected</p></li><li><p>Restart gets fresh range from regional</p></li></ul><p>Compare this to Snowflake, where a clock going backward can corrupt your entire ID space, or to flat slab allocation, where the central database is touched by every node.</p><h4><strong>Adaptive Chunk Sizing</strong></h4><p>Just as modern allocators adjust allocation sizes based on demand, hierarchical ID allocators can adapt:</p><pre><code>class AdaptiveAllocator:
    def __init__(self, tier, parent):
        self.tier = tier
        self.parent = parent
        self.base_chunk = BASE_SIZES[tier]
        self.current_chunk = self.base_chunk

    def request_range(self, urgency=&#8221;normal&#8221;):
        # Track consumption rate
        consumption_rate = self.ids_used / self.time_elapsed

        if urgency == &#8220;emergency&#8221; or consumption_rate &gt; THRESHOLD:
            # We&#8217;re burning through IDs fast, request more
            self.current_chunk = min(
                self.current_chunk * 2,
                self.base_chunk * 16
            )
        elif consumption_rate &lt; THRESHOLD / 10:
            # We&#8217;re barely using IDs, request less
            self.current_chunk = max(
                self.current_chunk / 2,
                self.base_chunk / 4
            )

        return self.parent.allocate(self.current_chunk)</code></pre><p>A sudden traffic spike? Leaves request larger chunks. Traffic dies down? Request smaller chunks to avoid waste. The system breathes with demand.</p><h4><strong>The Buddy System Angle</strong></h4><p>For even more sophisticated range management, consider the buddy allocator pattern:</p><pre><code>Initial space: [0, 2^32)

Split on demand (power-of-2 blocks):

                    [0, 2^32)
                   /         \
           [0, 2^31)        [2^31, 2^32)
           /      \              ...
    [0, 2^30)  [2^30, 2^31)
       ...         ...

Benefits:
- Easy to find appropriately-sized blocks
- Simple coalescing when ranges returned
- Enables dynamic rebalancing</code></pre><p>When a service scales down and returns unused IDs, buddy coalescing can reclaim and redistribute them. This is overkill for most systems, but demonstrates the depth of the design space.</p><div><hr></div><h3><strong>Solution 3: Consensus as ID Generation</strong></h3><p>Now for a different approach entirely.</p><p>What if you already run a consensus system&#8212;ZooKeeper, etcd, a Raft-based database? You&#8217;re already paying for consensus. Can you get IDs for free?</p><h4><strong>The Log Index Is Your ID</strong></h4><p>In Multi-Paxos or Raft, every committed entry has a unique, monotonically increasing <strong>log index</strong>. This index is:</p><ul><li><p>Unique (by definition of consensus)</p></li><li><p>Totally ordered (slot N comes before slot N+1)</p></li><li><p>Durable (replicated to a quorum)</p></li><li><p>Agreed upon (that&#8217;s what consensus means)</p></li></ul><p>That&#8217;s... an ID.</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                 Consensus Log as ID Generator               &#9474;
&#9474;                                                             &#9474;
&#9474;   Log Index:  ... | 47 | 48 | 49 | 50 | 51 | ...           &#9474;
&#9474;   Content:        |cmd |cmd |cmd |cmd |cmd |               &#9474;
&#9474;                                                             &#9474;
&#9474;   Each index IS a unique, ordered identifier                &#9474;
&#9474;                                                             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><h4><strong>Real Implementations</strong></h4><p><strong>ZooKeeper&#8217;s Sequential Znodes:</strong></p><pre><code>zk.create(&#8221;/ids/id-&#8221;, data, CreateMode.PERSISTENT_SEQUENTIAL);
// Returns: &#8220;/ids/id-0000000047&#8221;
// The suffix is the consensus sequence number</code></pre><p><strong>etcd&#8217;s Revision Number:</strong><br>Every write to etcd increments a global revision. With proper batching, etcd achieves 60,000-180,000 operations per second on modern hardware.</p><p><strong>Neon&#8217;s Log Sequence Numbers:</strong><br>Neon (the serverless Postgres company) uses a Paxos-like protocol for WAL sequence numbers. Their compute nodes propose entries, safekeepers agree on ordering, and the consensus slot becomes the LSN.</p><h4><strong>Batching and Pipelining</strong></h4><p>Naive consensus-per-ID is slow (one round-trip per ID). But you can batch:</p><pre><code>Time window (1ms):
  Request 1: &#8220;need an ID&#8221;
  Request 2: &#8220;need an ID&#8221;
  ...
  Request 100: &#8220;need an ID&#8221;

Leader batches into single consensus round:
  Propose: &#8220;Allocate IDs [1000, 1100)&#8221;

After commit:
  Request 1 &#8594; 1000
  Request 2 &#8594; 1001
  ...
  Request 100 &#8594; 1099

Amortized: 1 consensus round per 100 IDs</code></pre><p>You can also pipeline&#8212;propose slot N+1 before slot N commits:</p><pre><code>t=0: Propose slot 100 (IDs 10000-10099)
t=1: Propose slot 101 (IDs 10100-10199)  &#8592; Don&#8217;t wait!
t=2: Propose slot 102 (IDs 10200-10299)
t=3: Commit for slot 100 arrives
t=4: Commit for slot 101 arrives
...</code></pre><p>With batching (1000 IDs per round), pipelining (depth 4), and 2ms round-trip:</p><p><strong>Throughput = (1000 &#215; 4) / 0.002s = 2,000,000 IDs/sec</strong></p><p>That&#8217;s competitive with Snowflake.</p><h4><strong>When Consensus Wins</strong></h4><p><strong>You already have it:</strong> If you&#8217;re running etcd, ZooKeeper, or a Raft-based database, ID generation is nearly free.</p><p><strong>Strict global ordering:</strong> Unlike Snowflake (where ID 43 can be created after ID 137 across nodes), consensus gives you:</p><pre><code>ID ordering = causal ordering</code></pre><p><strong>Clock skepticism:</strong> Edge computing, IoT, multi-cloud with NTP variance&#8212;anywhere clocks are unreliable.</p><p><strong>Transactional semantics:</strong></p><pre><code>BEGIN;
  INSERT INTO orders (id, ...) VALUES (next_id(), ...);
  -- If transaction aborts, ID is never committed
  -- Can be reclaimed (unlike Snowflake)
COMMIT;</code></pre><h4><strong>When Consensus Loses</strong></h4><p><strong>Cross-region latency:</strong> 70ms round-trip between US and EU means minimum 70ms per ID (without heavy batching). Snowflake: 0ms.</p><p><strong>Availability during partitions:</strong> Consensus requires quorum. Network partition &#8594; minority partition can&#8217;t generate IDs. Snowflake works independently.</p><p><strong>Simplicity:</strong> Snowflake is ~50 lines. Production Raft is ~10,000+.</p><div><hr></div><h3><strong>Solution 4: Hybrid Approaches</strong></h3><p>The most powerful designs combine these approaches.</p><h4><strong>Consensus-Backed Slab Allocation</strong></h4><p>Use consensus to allocate ranges, then bump-pointer locally:</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;              Consensus-Backed Slab Allocator                &#9474;
&#9474;                                                             &#9474;
&#9474;                    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;                      &#9474;
&#9474;                    &#9474;  Raft/Paxos     &#9474;                      &#9474;
&#9474;                    &#9474;  Cluster (3-5)  &#9474;                      &#9474;
&#9474;                    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;                      &#9474;
&#9474;                             &#9474;                               &#9474;
&#9474;           Consensus on: &#8220;Service A gets [1M, 2M)&#8221;           &#9474;
&#9474;                             &#9474;                               &#9474;
&#9474;         &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9532;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;           &#9474;
&#9474;         &#9660;                   &#9660;                   &#9660;           &#9474;
&#9474;    &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;         &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;         &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;      &#9474;
&#9474;    &#9474;Service A&#9474;         &#9474;Service B&#9474;         &#9474;Service C&#9474;      &#9474;
&#9474;    &#9474;[1M, 2M) &#9474;         &#9474;[2M, 3M) &#9474;         &#9474;[3M, 4M) &#9474;      &#9474;
&#9474;    &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;         &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;         &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;      &#9474;
&#9474;                                                             &#9474;
&#9474;    Local: counter++ (zero coordination)                     &#9474;
&#9474;    Range exhausted: back to consensus cluster               &#9474;
&#9474;                                                             &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>Benefits:</p><ul><li><p>Range allocations are durable and consistent (consensus)</p></li><li><p>Individual IDs are fast (local counter)</p></li><li><p>Full audit trail (&#8221;who got what range when&#8221;)</p></li><li><p>Clean failure recovery (replay consensus log)</p></li></ul><h4><strong>Snowflake + Slab Hybrid</strong></h4><p>Embed slab allocation in the Snowflake structure:</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474;                  Hybrid ID (64 bits)                        &#9474;
&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
&#9474; 32 bits         &#9474; 16 bits         &#9474; 16 bits                 &#9474;
&#9474; Slab number     &#9474; Timestamp       &#9474; Sequence                &#9474;
&#9474; (from central)  &#9474; (seconds)       &#9474; (local)                 &#9474;
&#9500;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9508;
&#9474; - Slabs provide rough ordering and locality                 &#9474;
&#9474; - Timestamp within slab maintains time ordering             &#9474;
&#9474; - Sequence handles burst within same second                 &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>You get slab locality for database writes AND time ordering within slabs.</p><div><hr></div><h2><strong>Step 4: Look Back &#8212; The Universal Pattern</strong></h2><p>Polya&#8217;s final step: <strong>&#8220;Can you use the result or method for other problems?&#8221;</strong></p><p>We found that memory allocators solved our problem decades ago. But the pattern is even more universal. The same structure appears across computer science:</p><h3><strong>Filesystems (ext4)</strong></h3><p>ext4 divides disk into block groups, each with its own bitmap:</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488; &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488; &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474; Block Group 0&#9474; &#9474; Block Group 1&#9474; &#9474; Block Group 2&#9474;
&#9474; &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488; &#9474; &#9474; &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488; &#9474; &#9474; &#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488; &#9474;
&#9474; &#9474; Bitmap   &#9474; &#9474; &#9474; &#9474; Bitmap   &#9474; &#9474; &#9474; &#9474; Bitmap   &#9474; &#9474;
&#9474; &#9474; Inodes   &#9474; &#9474; &#9474; &#9474; Inodes   &#9474; &#9474; &#9474; &#9474; Inodes   &#9474; &#9474;
&#9474; &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496; &#9474; &#9474; &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496; &#9474; &#9474; &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496; &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496; &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496; &#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>Local allocation within groups, minimal global contention. Same pattern.</p><h3><strong>Streaming (Kafka)</strong></h3><p>Kafka partitions have independent offset sequences:</p><pre><code>Partition 0: [0, 1, 2, 3, 4, ...]  &#8592; Sequential within
Partition 1: [0, 1, 2, 3, ...]     &#8592; Independent sequences
Partition 2: [0, 1, 2, ...]        &#8592; No cross-partition ordering</code></pre><p>Same pattern: per-partition sequencing, no global coordination.</p><h3><strong>Scheduling (Work Stealing)</strong></h3><p>Parallel schedulers give each worker a local queue. When empty, steal from others:</p><pre><code>Worker A: [&#9608;&#9608;&#9608;&#9608;]     Worker B: [    ] &#8592; steal &#8594; Worker C: [&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;&#9608;]</code></pre><p>Same pattern: local resources, coordinate only when necessary.</p><h3><strong>Time (Hybrid Logical Clocks)</strong></h3><p>CockroachDB&#8217;s HLC combines physical and logical time:</p><pre><code>&#9484;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9516;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9488;
&#9474; Physical (wall clock)   &#9474; Logical (counter)         &#9474;
&#9492;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9524;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9472;&#9496;</code></pre><p>Stays close to real time, but logical component ensures causality. Hybrid approach&#8212;same principle.</p><h3><strong>The Meta-Pattern</strong></h3><p>All these domains solve the same fundamental problem: <strong>distributing access to a shared resource while minimizing coordination</strong>.</p><p>The solution is always some variant of:</p><ol><li><p><strong>Hierarchy</strong> &#8212; Multiple tiers with different granularities</p></li><li><p><strong>Locality</strong> &#8212; Push work to the edges</p></li><li><p><strong>Batching</strong> &#8212; Amortize coordination costs</p></li><li><p><strong>Prefetching</strong> &#8212; Anticipate needs before they arise</p></li></ol><p>These patterns were discovered in OS research in the 1970s-80s. They were refined in memory allocators through the 90s-2000s. And they apply directly to distributed systems today.</p><h3><strong>Why the Patterns Transfer: Parallel &#8834; Distributed</strong></h3><p>There&#8217;s a deeper reason why memory allocator patterns work for distributed ID generation: <strong>parallel programming is a special case of distributed programming</strong>.</p><p>Both solve the same fundamental problem: independent execution units coordinating access to shared resources. The difference is in the constraints:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A0Iq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A0Iq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!A0Iq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!A0Iq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!A0Iq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A0Iq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!A0Iq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!A0Iq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!A0Iq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!A0Iq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F213ae086-f72d-4ba7-b8fc-0e8fe53be193_1408x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>The implication</strong>: If you solve a problem under distributed constraints, the solution automatically works for parallel. But not always vice versa.</p><p>This is why tcmalloc&#8217;s patterns transfer so cleanly&#8212;the coordination avoidance principles that work across threads (where lock acquisition is expensive) also work across continents (where network round-trips are expensive). The cost function changes, but the optimization strategy remains the same.</p><p><strong>What transfers directly:</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r9V2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r9V2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 424w, https://substackcdn.com/image/fetch/$s_!r9V2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 848w, https://substackcdn.com/image/fetch/$s_!r9V2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 1272w, https://substackcdn.com/image/fetch/$s_!r9V2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r9V2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png" width="1188" height="552" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:552,&quot;width&quot;:1188,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:85658,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183416903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r9V2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 424w, https://substackcdn.com/image/fetch/$s_!r9V2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 848w, https://substackcdn.com/image/fetch/$s_!r9V2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 1272w, https://substackcdn.com/image/fetch/$s_!r9V2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5fd16370-1199-42d5-9b84-77b3a077db23_1188x552.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>What doesn&#8217;t transfer</strong> (the &#8220;distributed tax&#8221;):</p><ul><li><p><strong>Partial failure</strong>: In parallel systems, if one thread crashes, the process dies. Clean slate. In distributed systems, Node A crashes while B and C continue&#8212;with stale views of A. This is why distributed systems need failure detectors, consensus, and replication.</p></li><li><p><strong>Unbounded latency</strong>: The <strong><a href="https://decentralizedthoughts.github.io/2019-12-15-asynchrony-uncommitted-lower-bound/">FLP impossibility result</a></strong> proves that deterministic consensus is impossible in asynchronous systems with even one crash failure. This fundamental limit doesn&#8217;t exist in parallel programming where timing is bounded.</p></li><li><p><strong>No shared memory</strong>: Parallel systems get cache coherency protocols (MESI) for free. Distributed systems must build replication and consistency from scratch.</p></li></ul><p><strong>The connecting figure</strong>: Leslie Lamport. His 1978 paper &#8220;<strong><a href="https://aminst.github.io/2024-03-31-time-clocks-and-ordering/">Time, Clocks, and the Ordering of Events in a Distributed System</a></strong>&#8220; introduced &#8220;happens-before&#8221;&#8212;a concept that applies equally to memory models (parallel) and causality (distributed). His bakery algorithm solved mutual exclusion for threads; Paxos solved consensus for nodes. Same mind, same patterns, different constraints.</p><p>Understanding this relationship is a superpower. When you face a distributed systems problem, ask: <em>&#8220;How did parallel programming solve this?&#8221;</em> Often, the core insight transfers&#8212;you just need to handle partial failure and unbounded latency on top.</p><div><hr></div><h2><strong>Decision Framework</strong></h2><p>When should you use each approach?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gGdZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gGdZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!gGdZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!gGdZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!gGdZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gGdZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!gGdZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 424w, https://substackcdn.com/image/fetch/$s_!gGdZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 848w, https://substackcdn.com/image/fetch/$s_!gGdZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 1272w, https://substackcdn.com/image/fetch/$s_!gGdZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c2cb72d-5590-4f82-ada6-b95f45ea689e_1408x768.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h3><strong>Trade-off Summary</strong></h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QGxg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QGxg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 424w, https://substackcdn.com/image/fetch/$s_!QGxg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 848w, https://substackcdn.com/image/fetch/$s_!QGxg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 1272w, https://substackcdn.com/image/fetch/$s_!QGxg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QGxg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png" width="1456" height="661" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:661,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128688,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183416903?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!QGxg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 424w, https://substackcdn.com/image/fetch/$s_!QGxg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 848w, https://substackcdn.com/image/fetch/$s_!QGxg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 1272w, https://substackcdn.com/image/fetch/$s_!QGxg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F920cab21-fad9-4238-bb75-bc25e9b7b11e_1582x718.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div><hr></div><h2><strong>Conclusion: The Method, Not Just The Answer</strong></h2><p>We started with a question: how do you generate unique IDs in a distributed system?</p><p>The standard answer is Snowflake. But by asking Polya&#8217;s question&#8212;<strong>&#8220;Do you know a related problem?&#8221;</strong>&#8212;we discovered an entire design space hidden behind one well-known solution.</p><p>Memory allocators solved this problem decades ago. The same patterns appear in filesystems, streaming systems, schedulers, and distributed clocks. Once you see the connection, the solutions almost derive themselves.</p><p><strong>The deeper lesson isn&#8217;t about ID generation. It&#8217;s about problem-solving.</strong></p><p>Next time you face a hard distributed systems problem, ask:</p><ol><li><p><strong>What is the underlying structure?</strong> (Unique resources, concurrent access, coordination cost)</p></li><li><p><strong>What other domain solved something similar?</strong> (OS, networking, databases, hardware)</p></li><li><p><strong>Can I extract and transfer the principle?</strong> (Hierarchy, locality, batching, prefetching)</p></li></ol><p>The best engineers don&#8217;t memorize solutions. They recognize patterns.</p><p>Eiji Nakatsu saw a kingfisher dive into water and redesigned a bullet train. The principles of tcmalloc power your ID generator. The patterns are everywhere&#8212;if you know how to look.</p><div><hr></div><h2><strong>Further Reading</strong></h2><p><strong>The Pattern</strong></p><ul><li><p><strong><a href="https://google.github.io/tcmalloc/design.html">TCMalloc Design</a></strong> &#8212; The memory allocator that inspired this thinking</p></li><li><p><strong><a href="https://www.microsoft.com/en-us/research/publication/mimalloc-free-list-sharding-in-action/">Mimalloc Paper</a></strong> &#8212; Free list sharding and segment allocation</p></li></ul><p><strong>The Solutions</strong></p><ul><li><p><strong><a href="https://github.com/Meituan-Dianping/Leaf">Meituan Leaf</a></strong> &#8212; Production slab-based ID generator</p></li><li><p><strong><a href="https://blog.twitter.com/engineering/en_us/a/2010/announcing-snowflake">Snowflake</a></strong> &#8212; Twitter&#8217;s original design</p></li><li><p><strong><a href="https://github.com/sony/sonyflake">Sonyflake</a></strong> &#8212; Variant optimized for longevity</p></li><li><p><strong><a href="https://neon.com/blog/paxos">Neon&#8217;s Paxos</a></strong> &#8212; Consensus for log sequence numbers</p></li><li><p><strong><a href="https://docs.pingcap.com/tidbcloud/tso/">TiDB TSO</a></strong> &#8212; Timestamp oracle design</p></li><li><p><strong><a href="https://cloud.google.com/solutions/sequence-generation-in-cloud-spanner">Spanner Sequences</a></strong> &#8212; Batch allocation in practice</p></li></ul><p><strong>The Parallel &#8596; Distributed Connection</strong></p><ul><li><p><strong><a href="https://aminst.github.io/2024-03-31-time-clocks-and-ordering/">Time, Clocks, and the Ordering of Events</a></strong> &#8212; Lamport&#8217;s foundational paper explained</p></li><li><p><strong><a href="https://decentralizedthoughts.github.io/2019-12-15-asynchrony-uncommitted-lower-bound/">FLP Impossibility</a></strong> &#8212; Why distributed is fundamentally harder</p></li><li><p><strong><a href="http://www.bailis.org/blog/when-does-consistency-require-coordination/">Coordination Avoidance in Databases</a></strong> &#8212; Peter Bailis on when coordination is necessary</p></li></ul><p><strong>The Method</strong></p><ul><li><p><strong><a href="https://en.wikipedia.org/wiki/How_to_Solve_It">How to Solve It</a></strong> &#8212; Polya&#8217;s classic on problem-solving heuristics</p></li><li><p><strong><a href="https://biomimicry.org.nz/the-shinkansen-and-the-kingfisher-a-tale-of-biomimicry-in-high-speed-rail-design/">The Shinkansen and Kingfisher</a></strong> &#8212; Cross-domain problem solving in action</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Linearity: Why Batching Works]]></title><description><![CDATA[And the property that makes neural network training computationally tractable]]></description><link>https://softwarebits.substack.com/p/linearity-why-batching-works</link><guid isPermaLink="false">https://softwarebits.substack.com/p/linearity-why-batching-works</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 03 Jan 2026 00:49:49 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!yl4b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>&#128214; <strong>For the best reading experience with properly rendered equations, <a href="https://ttsugriy.github.io/perf-bits/linearity.html">view this article on GitHub Pages</a>.</strong></p></blockquote><div><hr></div><p>Here&#8217;s something that should seem stranger than it does:</p><p>You can train a neural network on 1,000 samples almost as fast as on 10.</p><p>Not 100x slower. <em>Almost the same speed.</em></p><p>How? The answer is a single property: <strong>linearity</strong>.</p><div><hr></div><h2>The Property</h2><p>A function f is linear if:</p><p><strong>f(&#945;x + &#946;y) = &#945;f(x) + &#946;f(y)</strong></p><p>Scale the input, scale the output. Add inputs, add outputs. Combinations work as expected.</p><p>Matrix multiplication is the canonical linear operation:</p><p><strong>f(x) = xW</strong></p><p>Check: (&#945;x + &#946;y)W = &#945;xW + &#946;yW. &#10003;</p><p>This simple property is why modern deep learning is computationally tractable.</p><div><hr></div><h2>Why Batching Works</h2><p>Consider a linear layer:</p><p><strong>y = xW</strong></p><p>For a single input x &#8712; &#8477;^(1&#215;d_in) (a row vector), you get output y &#8712; &#8477;^(1&#215;d_out).</p><p>Now consider a batch of n inputs, stacked as rows:</p><pre><code><code>    &#9484; x&#8321; &#9488;
X = &#9474; x&#8322; &#9474;  &#8712; &#8477;^(n&#215;d_in)
    &#9474; &#8942;  &#9474;
    &#9492; x&#8345; &#9496;</code></code></pre><p>The batched computation:</p><p><strong>Y = XW</strong></p><p>gives you all n outputs in one matrix multiply. Same W, same operation&#8212;just more rows.</p><p><strong>This only works because the operation is linear.</strong></p><p>If f weren&#8217;t linear, you couldn&#8217;t factor through the batch. You&#8217;d have to compute f(x&#8321;), f(x&#8322;), &#8230; separately.</p><p>But for linear operations, batching is free&#8212;mathematically. You&#8217;re computing the same thing, just organized differently.</p><div><hr></div><h2>Why GPUs Love Linearity</h2><p>Matrix multiplication is the most optimized operation in computing.</p><ul><li><p><strong>NVIDIA Tensor Cores</strong>: Designed specifically for GEMM (General Matrix Multiply)</p></li><li><p><strong>Memory bandwidth</strong>: Amortized across the batch</p></li><li><p><strong>Parallelism</strong>: Thousands of multiply-adds happening simultaneously</p></li></ul><p>When you increase batch size:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HNFK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HNFK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 424w, https://substackcdn.com/image/fetch/$s_!HNFK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 848w, https://substackcdn.com/image/fetch/$s_!HNFK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 1272w, https://substackcdn.com/image/fetch/$s_!HNFK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HNFK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png" width="924" height="222" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:222,&quot;width&quot;:924,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:44964,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183215519?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HNFK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 424w, https://substackcdn.com/image/fetch/$s_!HNFK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 848w, https://substackcdn.com/image/fetch/$s_!HNFK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 1272w, https://substackcdn.com/image/fetch/$s_!HNFK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04919b53-d1eb-4fac-a65e-da5b1e2f3c11_924x222.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The weight matrix W is loaded once. Each additional sample in the batch is nearly free&#8212;you&#8217;re just doing more arithmetic while the data is already in fast memory.</p><p><strong>Linearity turns &#8220;process n samples&#8221; into &#8220;one big matrix multiply.&#8221;</strong></p><div><hr></div><h2>Gradient Accumulation</h2><p>Here&#8217;s another consequence of linearity.</p><p>When you train on a batch, your loss is typically:</p><p><strong>L = (1/n) &#931;&#7522; L&#7522;</strong></p><p>The gradient:</p><p><strong>&#8711;L = (1/n) &#931;&#7522; &#8711;L&#7522;</strong></p><p>Sum is linear. So:</p><ul><li><p>Compute gradients on samples 1-100, sum them</p></li><li><p>Compute gradients on samples 101-200, sum them</p></li><li><p>Add the partial sums</p></li></ul><p>Same result as computing on all 200 at once.</p><p><strong>This is gradient accumulation.</strong> When your batch doesn&#8217;t fit in memory, split it. Accumulate gradients across passes. Linearity guarantees correctness.</p><p>The same principle enables <strong>distributed training</strong>: compute gradients on different machines, sum them (all-reduce). Works because gradient aggregation is linear.</p><div><hr></div><h2>Why We Need Non-Linearity</h2><p>If linearity is so great, why not make everything linear?</p><p>Because composition of linear functions is linear:</p><p><strong>f(g(x)) = (xW_g)W_f = x(W_g W_f) = xW_combined</strong></p><p>A 100-layer linear network equals a 1-layer linear network. No matter how deep you go, you can only learn linear functions.</p><p><strong>Non-linearities create expressivity.</strong></p><p>ReLU, GELU, softmax&#8212;these break linearity. They let deep networks approximate arbitrary functions.</p><p>The architecture of a neural network is:</p><pre><code><code>Linear &#8594; Non-linear &#8594; Linear &#8594; Non-linear &#8594; ... &#8594; Linear</code></code></pre><p>Linear operations: expensive, but batch-friendly, GPU-optimized. Non-linear operations: cheap (element-wise), parallel across the batch but no GEMM speedup.</p><p>This isn&#8217;t accidental. It&#8217;s engineered for hardware.</p><div><hr></div><h2>Where Linearity Breaks (And It Matters)</h2><h3>Batch Normalization</h3><p><strong>BatchNorm(x) = &#947; &#183; (x - &#956;_B) / &#963;_B + &#946;</strong></p><p>The mean &#956;_B and standard deviation &#963;_B depend on <em>which samples are in the batch</em>.</p><p>Change the batch composition &#8594; change the normalization &#8594; change the output.</p><p>This is why:</p><ul><li><p>BatchNorm behaves differently in training vs. inference</p></li><li><p>Small batches give noisy estimates</p></li><li><p>BatchNorm can&#8217;t be cleanly gradient-accumulated</p></li></ul><p><strong>BatchNorm is not linear over the batch dimension.</strong></p><h3>Softmax in Attention</h3><p><strong>softmax(x)&#7522; = exp(x&#7522;) / &#931;&#11388; exp(x&#11388;)</strong></p><p>Every output depends on all inputs. You can&#8217;t compute softmax on parts and combine.</p><p>(Well, you can&#8212;that&#8217;s what we showed in the associativity article. But it requires the correction factor trick. It&#8217;s not <em>trivially</em> decomposable.)</p><h3>Dropout</h3><p>Stochastic. Different mask each time. Can&#8217;t be factored cleanly.</p><div><hr></div><h2>Backpropagation: Linearity of Differentiation</h2><p>Here&#8217;s a deeper consequence.</p><p>Backpropagation relies on the chain rule:</p><p><strong>&#8706;L/&#8706;x = &#8706;L/&#8706;y &#183; &#8706;y/&#8706;x</strong></p><p>But it also relies on differentiation being a linear operator:</p><p><strong>&#8706;/&#8706;x(f + g) = &#8706;f/&#8706;x + &#8706;g/&#8706;x</strong></p><p><strong>&#8706;/&#8706;x(&#945;f) = &#945; &#183; &#8706;f/&#8706;x</strong></p><p>Gradients add linearly. Scale linearly. This is why:</p><ul><li><p>Gradient of a sum = sum of gradients</p></li><li><p>Gradient accumulation works</p></li><li><p>Automatic differentiation is efficient</p></li></ul><p><strong>If differentiation weren&#8217;t linear, we couldn&#8217;t train neural networks.</strong></p><p>The entire training paradigm&#8212;backprop, SGD, Adam&#8212;relies on gradients being linear in how they combine.</p><div><hr></div><h2>Practical Implications</h2><h3>Batch Size Tuning</h3><p>Larger batches &#8594; better GPU utilization &#8594; faster per-sample processing.</p><p>But: larger batches can hurt generalization (sharper minima, less noise).</p><p>The trade-off is between:</p><ul><li><p><strong>Hardware efficiency</strong> (wants large batches, because linearity makes them cheap)</p></li><li><p><strong>Optimization dynamics</strong> (sometimes wants smaller batches, for noise/regularization)</p></li></ul><h3>Gradient Checkpointing</h3><p>To save memory, you can:</p><ol><li><p>Discard intermediate activations during forward pass</p></li><li><p>Recompute them during backward pass</p></li></ol><p>This works because the forward pass is deterministic&#8212;same input, same output. Recompute any segment, get identical activations, get identical gradients.</p><h3>LoRA and Adapter Merging</h3><p>Low-Rank Adaptation adds a small update:</p><p><strong>W&#8217; = W + BA</strong></p><p>where B and A are low-rank matrices.</p><p>After training, you can <strong>merge</strong> the adapter back:</p><p><strong>W_merged = W + BA</strong></p><p>One matrix, no overhead at inference.</p><p>This works because matrix addition is linear. The adaptation is just a linear modification to the weights.</p><div><hr></div><h2>The Architecture of Efficiency</h2><p>Modern neural networks are carefully designed around linearity:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yl4b!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yl4b!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 424w, https://substackcdn.com/image/fetch/$s_!yl4b!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 848w, https://substackcdn.com/image/fetch/$s_!yl4b!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 1272w, https://substackcdn.com/image/fetch/$s_!yl4b!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yl4b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png" width="1302" height="454" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:454,&quot;width&quot;:1302,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104173,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/183215519?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!yl4b!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 424w, https://substackcdn.com/image/fetch/$s_!yl4b!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 848w, https://substackcdn.com/image/fetch/$s_!yl4b!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 1272w, https://substackcdn.com/image/fetch/$s_!yl4b!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e83f781-af0a-4c25-917b-815a120dfc54_1302x454.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Notice the trend: we use LayerNorm instead of BatchNorm in Transformers. Why? LayerNorm normalizes within each sample, not across the batch. It&#8217;s linear over the batch dimension.</p><p><strong>Architecture choices reflect the desire to preserve linearity where it matters.</strong></p><div><hr></div><h2>The Takeaway</h2><p>Linearity is why batching works.</p><p><strong>f(batch) = batch of f</strong></p><p>For linear operations, processing a batch is just one big matrix multiply. GPUs are optimized for exactly this.</p><p>This single property enables:</p><ul><li><p><strong>Batched inference</strong>: 1000 samples nearly as fast as 1</p></li><li><p><strong>Batched training</strong>: gradients over many samples at once</p></li><li><p><strong>Gradient accumulation</strong>: split batches, sum gradients</p></li><li><p><strong>Distributed training</strong>: sum gradients across machines</p></li><li><p><strong>Backpropagation itself</strong>: gradients combine linearly</p></li></ul><p>Neural networks are towers of linear operations with strategic non-linearities. The linear parts enable efficiency. The non-linear parts enable expressivity.</p><p>Lose linearity carelessly, and you lose the ability to batch. That&#8217;s why BatchNorm is tricky. That&#8217;s why softmax needed FlashAttention.</p><p>The algebra isn&#8217;t abstract. It&#8217;s why training is tractable at all.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>Next in this series: Domain Transformations&#8212;why logarithms prevent underflow, why Fourier transforms speed up convolutions, and the art of finding easier spaces.</em></p><p></p><div><hr></div><p><em>See also: <a href="https://ttsugriy.github.io/perf-bits/associativity.html">The One Property That Makes FlashAttention Possible</a> &#8212; Associativity is the license to parallelize, chunk, and stream.</em></p><div><hr></div><h2>Further Reading</h2><ul><li><p><a href="https://distill.pub/2017/momentum/">Why Momentum Really Works</a> &#8212; Optimization dynamics and batch size</p></li><li><p><a href="https://arxiv.org/abs/2103.13630">A Survey of Quantization Methods</a> &#8212; Linear error accumulation in approximate computation</p></li><li><p><a href="https://arxiv.org/abs/2106.09685">LoRA: Low-Rank Adaptation</a> &#8212; Exploiting linearity for efficient fine-tuning</p></li><li><p><a href="https://arxiv.org/abs/1502.03167">Batch Normalization</a> &#8212; And why it complicates things</p></li></ul><p><em>Next in this series: Domain Transformations&#8212;why logarithms prevent underflow, why Fourier transforms speed up convolutions, and the art of finding easier spaces.</em></p>]]></content:encoded></item><item><title><![CDATA[Commutativity: Why Transformers Need Positional Encodings]]></title><description><![CDATA[And other consequences of order not mattering]]></description><link>https://softwarebits.substack.com/p/commutativity-why-transformers-need</link><guid isPermaLink="false">https://softwarebits.substack.com/p/commutativity-why-transformers-need</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Thu, 01 Jan 2026 17:12:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!2ov6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote><p>&#128214; <strong>For the best reading experience with properly rendered equations, <a href="https://ttsugriy.github.io/perf-bits/commutativity.html">view this article on GitHub Pages</a>.</strong></p></blockquote><div><hr></div><p>Here&#8217;s a question that seems too simple to be interesting:</p><p><strong>Why do Transformers need positional encodings?</strong></p><p>The standard answer: &#8220;So the model knows where each token is in the sequence.&#8221;</p><p>But <em>why</em> doesn&#8217;t it know already? What is it about attention that loses position information?</p><p>The answer is a single word: <strong>commutativity</strong>.</p><div><hr></div><h2>The Property</h2><p>Commutativity means order doesn&#8217;t matter:</p><p><strong>a + b = b + a</strong></p><p>Simple. Obvious. But the consequences run deep.</p><p>If an operation is commutative, permuting the inputs doesn&#8217;t change the output:</p><p><strong>f(a, b, c) = f(c, a, b) = f(b, c, a)</strong></p><p>The operation can&#8217;t tell what order things arrived in. It treats all orderings identically.</p><div><hr></div><h2>Attention Is Commutative</h2><p>Look at self-attention:</p><p><strong>Attention(Q, K, V) = softmax(QK&#7488; / &#8730;d) &#215; V</strong></p><p>Given a sequence X = [x&#8321;, x&#8322;, &#8230;, x&#8345;], we compute:</p><ul><li><p>Q = XW_Q</p></li><li><p>K = XW_K</p></li><li><p>V = XW_V</p></li></ul><p>Now permute the input: X&#8217; = [x&#8323;, x&#8321;, x&#8322;, &#8230;]</p><p>What happens? The output is permuted the same way.</p><p><strong>Attention is permutation-equivariant.</strong> Shuffle the input, get a shuffled output. The operation itself doesn&#8217;t care about order.</p><p>This means without positional encodings:</p><pre><code><code>"I love you"  &#8594;  [embed("I"), embed("love"), embed("you")]
"you love I"  &#8594;  [embed("you"), embed("love"), embed("I")]</code></code></pre><p>These would produce the same representation (just permuted). The model literally cannot distinguish them.</p><p><strong>Positional encodings exist because attention is commutative.</strong></p><p>We add position information explicitly because the architecture won&#8217;t infer it.</p><div><hr></div><h2>The Design Choice</h2><p>This commutativity is a feature, not a bug.</p><p><strong>RNNs</strong> are explicitly non-commutative:</p><p><strong>h&#8348; = f(h&#8348;&#8331;&#8321;, x&#8348;)</strong></p><p>Each state depends on the previous state. Order is baked into the recurrence. You can&#8217;t permute the input without changing everything.</p><p>The cost: you can&#8217;t parallelize. Each step waits for the previous one.</p><p><strong>Transformers</strong> are commutative (permutation-equivariant):</p><p><strong>O = Attention(X)</strong></p><p>Order is not baked in. You add it explicitly through positional encodings.</p><p>The benefit: you can parallelize. All positions are processed simultaneously.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ozoz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ozoz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 424w, https://substackcdn.com/image/fetch/$s_!ozoz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 848w, https://substackcdn.com/image/fetch/$s_!ozoz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 1272w, https://substackcdn.com/image/fetch/$s_!ozoz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ozoz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png" width="1456" height="236" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/70913088-3646-47c6-9146-792a1a35a32a_1644x266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:236,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:36409,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182997547?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ozoz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 424w, https://substackcdn.com/image/fetch/$s_!ozoz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 848w, https://substackcdn.com/image/fetch/$s_!ozoz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 1272w, https://substackcdn.com/image/fetch/$s_!ozoz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F70913088-3646-47c6-9146-792a1a35a32a_1644x266.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p><strong>Commutativity enables parallelization.</strong> This is why Transformers replaced RNNs for long sequences.</p><div><hr></div><h2>When You Want Commutativity</h2><p>Sometimes order genuinely doesn&#8217;t matter. Then commutativity isn&#8217;t a limitation&#8212;it&#8217;s a requirement.</p><h3>Point Clouds</h3><p>A 3D scan gives you points {(x&#8321;, y&#8321;, z&#8321;), (x&#8322;, y&#8322;, z&#8322;), &#8230;}.</p><p>These points have no natural order. The first point scanned isn&#8217;t semantically &#8220;first.&#8221;</p><p>Your network must be <strong>permutation invariant</strong>:</p><p><strong>f({p&#8321;, p&#8322;, p&#8323;}) = f({p&#8323;, p&#8321;, p&#8322;})</strong></p><p><strong>PointNet (2017)</strong> achieves this by design:</p><p><strong>f(X) = g(max&#7522; h(x&#7522;))</strong></p><p>Max is commutative. Shuffle the points, get the same output.</p><h3>Sets</h3><p>A shopping cart. A user&#8217;s friends. Atoms in a molecule.</p><p>These are sets&#8212;order doesn&#8217;t exist.</p><p><strong>DeepSets (2017)</strong> proved the fundamental theorem:</p><blockquote><p>Any permutation-invariant function on sets can be written as: <strong>f(X) = &#961;(&#931; &#966;(x))</strong> for all x &#8712; X</p></blockquote><p>Sum is commutative. The architecture is order-invariant by construction.</p><h3>Graphs</h3><p>In a graph neural network, you aggregate neighbor features:</p><p><strong>h&#7525; = UPDATE(h&#7525;, AGG({h&#7524; : u &#8712; N(v)}))</strong></p><p>The neighbors N(v) have no order. AGG must be commutative&#8212;sum, mean, or max.</p><div><hr></div><h2>When You Don&#8217;t Want Commutativity</h2><p>Sometimes order is everything.</p><p><strong>Language</strong>: &#8220;Dog bites man&#8221; &#8800; &#8220;Man bites dog&#8221;</p><p><strong>Time series</strong>: The sequence of stock prices matters</p><p><strong>Music</strong>: Notes in order form melody; shuffled, they&#8217;re noise</p><p><strong>Actions</strong>: The order of operations matters (usually)</p><p>For these, you need either:</p><ol><li><p><strong>Non-commutative operations</strong> (RNNs, state machines)</p></li><li><p><strong>Explicit position encoding</strong> (Transformers)</p></li></ol><p>The choice affects parallelization, inductive bias, and what the model can learn.</p><div><hr></div><h2>Gradient Aggregation: Why Training Works</h2><p>Here&#8217;s a less obvious place commutativity matters.</p><p>When you train on a minibatch, you compute:</p><p><strong>L = (1/N) &#931; L(x&#7522;, y&#7522;)</strong></p><p><strong>&#8711;L = (1/N) &#931; &#8711;L(x&#7522;, y&#7522;)</strong></p><p>The sum of gradients is commutative. This enables:</p><p><strong>Minibatch training</strong>: Compute gradients for samples in any order, sum them.</p><p><strong>Gradient accumulation</strong>: Split a large batch across multiple forward passes, sum the gradients.</p><p><strong>Distributed training</strong>: Compute gradients on different machines, sum them (all-reduce).</p><p>If gradient aggregation weren&#8217;t commutative, distributed training would be impossible. The order of machines would matter.</p><div><hr></div><h2>Pooling: The Invariance/Information Trade-off</h2><p>Global pooling&#8212;mean, max, sum&#8212;is commutative.</p><p>This gives you <strong>translation invariance</strong>:</p><pre><code><code>[ cat in left of image  ] &#8594; pool &#8594; representation
[ cat in right of image ] &#8594; pool &#8594; same representation</code></code></pre><p>The pooled representation doesn&#8217;t know where the cat was.</p><p><strong>The trade-off</strong>: commutativity destroys positional information.</p><ul><li><p><strong>Want invariance?</strong> Use commutative pooling.</p></li><li><p><strong>Want to preserve position?</strong> Don&#8217;t pool, or use position-aware alternatives.</p></li></ul><p>This is why object detection uses feature pyramids instead of global pooling&#8212;you need to know <em>where</em> things are.</p><div><hr></div><h2>Designing with Commutativity</h2><p>When building an architecture, ask:</p><p><strong>Does order matter in my input?</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2ov6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2ov6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 424w, https://substackcdn.com/image/fetch/$s_!2ov6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 848w, https://substackcdn.com/image/fetch/$s_!2ov6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 1272w, https://substackcdn.com/image/fetch/$s_!2ov6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2ov6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png" width="1456" height="441" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f2b13707-345b-49e9-8987-3331c648400d_1646x498.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:441,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:86980,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182997547?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!2ov6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 424w, https://substackcdn.com/image/fetch/$s_!2ov6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 848w, https://substackcdn.com/image/fetch/$s_!2ov6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 1272w, https://substackcdn.com/image/fetch/$s_!2ov6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff2b13707-345b-49e9-8987-3331c648400d_1646x498.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>Does order matter in my output?</strong></p><p>If you&#8217;re generating sequences, you need autoregressive structure&#8212;fundamentally non-commutative.</p><p><strong>Can I parallelize?</strong></p><p>Commutative operations can be parallelized and distributed. Non-commutative ones often can&#8217;t.</p><div><hr></div><h2>The Floating-Point Footnote</h2><p>One subtlety worth knowing:</p><p>In exact arithmetic, addition is both commutative (a + b = b + a) and associative ((a + b) + c = a + (b + c)).</p><p>In floating-point:</p><ul><li><p><strong>Commutativity: preserved</strong> &#10003;</p></li><li><p><strong>Associativity: broken</strong> &#10007;</p></li></ul><pre><code><code>&gt;&gt;&gt; (1e20 + (-1e20)) + 1
1.0
&gt;&gt;&gt; 1e20 + ((-1e20) + 1)
0.0
</code></code></pre><p>Reordering is safe. Regrouping isn&#8217;t.</p><p>This means parallel reductions (which require regrouping) can give slightly different results on different runs.</p><p>This <em>contributes</em> to ML non-reproducibility, but <a href="https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/">research from Thinking Machines</a> shows the primary culprit is subtler: GPU kernels change their reduction strategies based on batch size. When server load varies, batch sizes vary, kernel behavior varies&#8212;and you get different results even with identical inputs.</p><p>Either way, this is a numerical concern, not an architectural one. The mathematical design choice&#8212;commutative or not&#8212;remains valid.</p><div><hr></div><h2>The Takeaway</h2><p>Commutativity is about order invariance.</p><p><strong>Where order doesn&#8217;t matter</strong>&#8212;sets, point clouds, graphs&#8212;use commutative operations. You get parallelization and natural invariance.</p><p><strong>Where order matters</strong>&#8212;sequences, time series&#8212;either use non-commutative operations (RNNs) or add position explicitly (Transformers).</p><p><strong>Transformers need positional encodings because attention is commutative.</strong> The architecture processes all positions symmetrically. Order must be injected from outside.</p><p>This single property&#8212;commutativity&#8212;explains:</p><ul><li><p>Why Transformers parallelize and RNNs don&#8217;t</p></li><li><p>Why PointNet works on point clouds</p></li><li><p>Why GNNs use sum/mean/max aggregation</p></li><li><p>Why global pooling loses spatial information</p></li><li><p>Why distributed training is possible</p></li></ul><p>The algebra isn&#8217;t abstract. It&#8217;s in every architecture you use.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption"><em>Next in this series: Linearity&#8212;why batching works, and the property that makes backpropagation possible.</em></p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p><em>See also: <a href="https://ttsugriy.github.io/perf-bits/associativity.html">The One Property That Makes FlashAttention Possible</a> &#8212; Associativity is the license to parallelize, chunk, and stream.</em></p><div><hr></div><h2>Further Reading</h2><ul><li><p><a href="https://arxiv.org/abs/1703.06114">Zaheer et al., &#8220;Deep Sets&#8221; (2017)</a> &#8212; The foundational theorem on permutation-invariant functions</p></li><li><p><a href="https://arxiv.org/abs/1612.00593">Qi et al., &#8220;PointNet&#8221; (2017)</a> &#8212; Processing point clouds with max pooling</p></li><li><p><a href="https://arxiv.org/abs/1706.03762">Vaswani et al., &#8220;Attention Is All You Need&#8221; (2017)</a> &#8212; Transformers and positional encodings</p></li><li><p><a href="https://arxiv.org/abs/2104.13478">Bronstein et al., &#8220;Geometric Deep Learning&#8221; (2021)</a> &#8212; Symmetry and invariance in neural networks</p></li><li><p><a href="https://thinkingmachines.ai/blog/defeating-nondeterminism-in-llm-inference/">Thinking Machines, &#8220;Defeating Nondeterminism in LLM Inference&#8221; (2025)</a> &#8212; Why batch-invariance failure causes non-reproducibility</p></li></ul>]]></content:encoded></item><item><title><![CDATA[The One Property That Makes FlashAttention Possible]]></title><description><![CDATA[What computing an average teaches us about the most important optimization in modern ML]]></description><link>https://softwarebits.substack.com/p/the-one-property-that-makes-flashattention</link><guid isPermaLink="false">https://softwarebits.substack.com/p/the-one-property-that-makes-flashattention</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Mon, 29 Dec 2025 18:07:58 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!buuD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>FlashAttention is everywhere.</p><p>It&#8217;s in PyTorch, JAX, and every LLM serving stack. It delivers 2-4x speedups and cuts memory from O(n&#178;) to O(n).</p><p>But ask practitioners <strong>why</strong> it works, and you get hand-wavy answers about &#8220;tiling&#8221; and &#8220;recomputation.&#8221;</p><p>Those are implementation details. Today I want to show you the actual <strong>why</strong> - the mathematical property that makes it all possible.</p><p>We&#8217;re not starting with attention though. We&#8217;re starting with something simpler: computing an average.</p><h2>A Simple Problem: The Average</h2><p>You have a billion numbers. You want their average.</p><p>The obvious approach:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tw4G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tw4G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 424w, https://substackcdn.com/image/fetch/$s_!tw4G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 848w, https://substackcdn.com/image/fetch/$s_!tw4G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 1272w, https://substackcdn.com/image/fetch/$s_!tw4G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tw4G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png" width="1200" height="596" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:596,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:123859,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!tw4G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 424w, https://substackcdn.com/image/fetch/$s_!tw4G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 848w, https://substackcdn.com/image/fetch/$s_!tw4G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 1272w, https://substackcdn.com/image/fetch/$s_!tw4G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9dd78af0-432d-48db-9946-aa48bd95fb51_1200x596.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>One number at a time. One core. One long wait.</p><p>But here&#8217;s the thing: <strong>you don&#8217;t have to process them in order</strong>.</p><p>Split the data into chunks. Compute each chunk&#8217;s sum and count separately:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{Chunk A: } (\\text{sum}_A = 1234567, \\quad \\text{count}_A = 500000000)&quot;,&quot;id&quot;:&quot;CFEMEKMPLC&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{Chunk B: } (\\text{sum}_B = 2345678, \\quad \\text{count}_B = 500000000)&quot;,&quot;id&quot;:&quot;XJPENRFONA&quot;}" data-component-name="LatexBlockToDOM"></div><p>Then combine:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{total} = \\text{sum}_A + \\text{sum}_B = 3580245&quot;,&quot;id&quot;:&quot;FHAXRQJPST&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{count} = \\text{count}_A + \\text{count}_B = 1000000000&quot;,&quot;id&quot;:&quot;KAKURINTOI&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{average} = \\frac{\\text{total}}{\\text{count}}&quot;,&quot;id&quot;:&quot;VSCUOPPJEP&quot;}" data-component-name="LatexBlockToDOM"></div><p>Same answer. But now you can process chunks in parallel.</p><h2>Why This Works: Associativity</h2><p>This works because addition is <em><strong>associative</strong></em>:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;(a + b) + c = a + (b + c)&quot;,&quot;id&quot;:&quot;KCSFXJNIVW&quot;}" data-component-name="LatexBlockToDOM"></div><p>Grouping doesn&#8217;t change the result.</p><p>More precisely: the pair (sum, count) can be <em>combined</em>, and that combination is associative. This single property unlocks three capabilities:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!buuD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!buuD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 424w, https://substackcdn.com/image/fetch/$s_!buuD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 848w, https://substackcdn.com/image/fetch/$s_!buuD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 1272w, https://substackcdn.com/image/fetch/$s_!buuD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!buuD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png" width="1200" height="856" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:856,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:154323,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!buuD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 424w, https://substackcdn.com/image/fetch/$s_!buuD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 848w, https://substackcdn.com/image/fetch/$s_!buuD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 1272w, https://substackcdn.com/image/fetch/$s_!buuD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43a6b00f-9fb7-40f6-90ad-494476be5bbc_1200x856.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>One algebraic property, three capabilities. If your combination operation is associative, you can split, parallelize, and stream - automatically.</strong></p><p>This might seem obvious for averages. But the same principle - find combinable state, verify associativity - applies to surprisingly complex operations.</p><p>Let&#8217;s try something harder.</p><h2>Why Softmax Seems Different</h2><p>Softmax is the heart of attention:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\operatorname{softmax}(x_{i}) = \\frac{\\exp(x_i)}{\\sum_j \\exp(x_j)}&quot;,&quot;id&quot;:&quot;CEPMBQQAAQ&quot;}" data-component-name="LatexBlockToDOM"></div><p></p><p>To compute <strong>any</strong> output, you need the sum over <strong>all</strong> elements.</p><p>If I show you half the values, you can&#8217;t produce final outputs. You&#8217;re missing half the denominator. Unlike our average, where partial sums combine cleanly, softmax seems to require everything upfront.</p><p>Can we find hidden associative structure anyway?</p><p>Before we answer, we need to address a practical problem.</p><h3>The Overflow Problem</h3><p>Here&#8217;s what breaks naive softmax:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qq9E!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qq9E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 424w, https://substackcdn.com/image/fetch/$s_!qq9E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 848w, https://substackcdn.com/image/fetch/$s_!qq9E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 1272w, https://substackcdn.com/image/fetch/$s_!qq9E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qq9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png" width="1200" height="558" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:558,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:110839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qq9E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 424w, https://substackcdn.com/image/fetch/$s_!qq9E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 848w, https://substackcdn.com/image/fetch/$s_!qq9E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 1272w, https://substackcdn.com/image/fetch/$s_!qq9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea519a9e-315d-456c-b9b1-eeeb81493747_1200x558.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>When values are large, exp() overflows to infinity. And attention scores can be large.</p><p>The fix exploits a mathematical identity&#8212;softmax is <em><strong>translation-invariant</strong></em>:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\sigma(\\mathbf{z} + \\mathbf{c})_j = \\frac{e^{z_j + c}}{\\sum_{k=1}^{K}\ne^{z_k + c}} = \\frac{e^{z_j} \\cdot e^c}{\\sum_{k=1}^{K} e^{z_k} \\cdot e^c} =\n\\sigma(\\mathbf{z})_j&quot;,&quot;id&quot;:&quot;TCCYUKFTJC&quot;}" data-component-name="LatexBlockToDOM"></div><p>for any constant c.</p><p>Subtracting the same value from every element doesn&#8217;t change the output. So we subtract the maximum:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\sigma(\\mathbf{z})_j = \\frac{e^{z_j - \\max_i z_i}}{\\sum_{k=1}^K e^{z_k -\n\\max_i z_i}} \\quad \\text{for } j = 1, \\ldots, K&quot;,&quot;id&quot;:&quot;RNZXCTGIHD&quot;}" data-component-name="LatexBlockToDOM"></div><p>Now every exponent is &#8804; 0, so exp() never exceeds 1. No overflow.</p><p>This is why you see max everywhere in softmax code. It&#8217;s not algorithmic - it&#8217;s survival.</p><p>But now we have two things to track: the <em>max</em> and the <em>sum</em>. Let&#8217;s see if they combine.</p><h2>The State for Softmax</h2><p>For our average, the state was <em>(sum, count)</em>.</p><p>For softmax, given values x&#8321;, x&#8322;, ..., x&#8345;, we need:</p><p>- <em>m</em> = max of all values</p><p>- <em>s</em> = sum of exp(x&#7522; - m)</p><p>Can we combine two such pairs from separate chunks?</p><h3>Why Simple Addition Fails</h3><p>Say we have:</p><pre><code>Chunk A: values [1, 2, 3]
         m_a = 3
         s_a = exp(1-3) + exp(2-3) + exp(3-3) &#8776; 1.50
Chunk B: values [4, 5]
         m_b = 5
         s_b = exp(4-5) + exp(5-5) &#8776; 1.37
The combined max is max(3, 5) = 5.</code></pre><p>But we can&#8217;t just add the sums.</p><p>Chunk A&#8217;s sum was computed relative to max=3. Chunk B&#8217;s sum relative to max=5. They&#8217;re in different &#8220;units.&#8221;</p><p>Adding 1.50 + 1.37 = 2.87 would be wrong.</p><h3>The Correction Factor</h3><p>Here&#8217;s the key insight.</p><p>Chunk A computed</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;s_A = \\sum e^{x - 3}&quot;,&quot;id&quot;:&quot;ZQNTTRVHRE&quot;}" data-component-name="LatexBlockToDOM"></div><p>.</p><p>But relative to the true max of 5, it should be</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\sum e^{x - 5}&quot;,&quot;id&quot;:&quot;DLAZWUWYAW&quot;}" data-component-name="LatexBlockToDOM"></div><p>These relate by:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;e^{x - 5} = e^{x - 3} \\cdot e^{3 - 5} = e^{x - 3} \\cdot e^{-2}\n&quot;,&quot;id&quot;:&quot;PSZCZXQNVP&quot;}" data-component-name="LatexBlockToDOM"></div><p>So we <em>correct</em> chunk A&#8217;s sum:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;s_A^{\\text{corrected}} = s_A \\cdot e^{m_A - m_{\\text{combined}}} = 1.50 \\cdot e^{3 - 5} = 1.50 \\cdot 0.135 \\approx 0.20\n&quot;,&quot;id&quot;:&quot;PUROOOJTEC&quot;}" data-component-name="LatexBlockToDOM"></div><p>Chunk B needs no correction (its max equals the combined max):</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;s_B^{\\text{corrected}} = 1.37 \\cdot e^{5 - 5} = 1.37 \\cdot 1 = 1.37\n&quot;,&quot;id&quot;:&quot;KTKBCWLEZS&quot;}" data-component-name="LatexBlockToDOM"></div><p>Combined:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;s_{\\text{combined}} = 0.20 + 1.37 = 1.57\n&quot;,&quot;id&quot;:&quot;NRAIFUVDWT&quot;}" data-component-name="LatexBlockToDOM"></div><p>Here&#8217;s what&#8217;s happening visually:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!rgo7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rgo7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 424w, https://substackcdn.com/image/fetch/$s_!rgo7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 848w, https://substackcdn.com/image/fetch/$s_!rgo7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!rgo7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rgo7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png" width="1200" height="1414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1414,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183673,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rgo7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 424w, https://substackcdn.com/image/fetch/$s_!rgo7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 848w, https://substackcdn.com/image/fetch/$s_!rgo7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 1272w, https://substackcdn.com/image/fetch/$s_!rgo7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F16dd7155-0889-448e-9534-88fab143f7d4_1200x1414.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><strong>The correction factor exp(m_local - m_global) rescales the local sum to the global reference frame.</strong></p><p>Let&#8217;s verify by computing directly on [1, 2, 3, 4, 5]:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;s = e^{-4} + e^{-3} + e^{-2} + e^{-1} + e^{0} = 0.02 + 0.05 + 0.14 + 0.37 + 1.00 = 1.57 \\checkmark\n&quot;,&quot;id&quot;:&quot;QCEWEFBMPL&quot;}" data-component-name="LatexBlockToDOM"></div><p>Same answer. The combination works.</p><h3>The Combine Rule</h3><p>We&#8217;ve derived the combination for softmax state:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Abuf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Abuf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 424w, https://substackcdn.com/image/fetch/$s_!Abuf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 848w, https://substackcdn.com/image/fetch/$s_!Abuf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 1272w, https://substackcdn.com/image/fetch/$s_!Abuf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Abuf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png" width="1200" height="596" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/be3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:596,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135857,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Abuf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 424w, https://substackcdn.com/image/fetch/$s_!Abuf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 848w, https://substackcdn.com/image/fetch/$s_!Abuf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 1272w, https://substackcdn.com/image/fetch/$s_!Abuf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbe3fc11c-c16b-46e0-9ac9-0280f7ab16a3_1200x596.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><em><strong>Is this associative?</strong></em></p><p>Yes. The algebra works out:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{combine}\\big(\\text{combine}(A, B), C\\big) = \\text{combine}\\big(A, \\text{combine}(B, C)\\big)\n&quot;,&quot;id&quot;:&quot;WEWXAPRRUG&quot;}" data-component-name="LatexBlockToDOM"></div><p>The pair (max, scaled_sum) forms a <em><strong>monoid</strong></em>&#8212;same structure as (sum, count) for averages, just with a more complex combination.</p><p>---</p><h3>The Pattern, Generalized</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zr2P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zr2P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 424w, https://substackcdn.com/image/fetch/$s_!Zr2P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 848w, https://substackcdn.com/image/fetch/$s_!Zr2P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 1272w, https://substackcdn.com/image/fetch/$s_!Zr2P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zr2P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png" width="1456" height="509" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:509,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:78504,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Zr2P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 424w, https://substackcdn.com/image/fetch/$s_!Zr2P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 848w, https://substackcdn.com/image/fetch/$s_!Zr2P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 1272w, https://substackcdn.com/image/fetch/$s_!Zr2P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F741171b9-b344-4d2b-b5e8-86954b969855_1654x578.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Same structure. Different complexity.</p><p>The softmax case requires correction because changing the max changes the meaning of the sum. But the fundamental pattern - combinable state, associative operation - is identical.</p><h2>FlashAttention: Applying the Pattern</h2><p>FlashAttention applies this to attention:</p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{Attention}(Q, K, V) = \\text{softmax}(QK^T) \\cdot V\n&quot;,&quot;id&quot;:&quot;WGVTVJAXEG&quot;}" data-component-name="LatexBlockToDOM"></div><p>Instead of the full n&#215;n matrix, it:</p><p>1. Processes tiles of K and V one at a time</p><p>2. Maintains running state: (max, sum, output)</p><p>3. Applies correction when a new tile reveals a larger max</p><p>4. Never materializes the full matrix</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1Beb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1Beb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 424w, https://substackcdn.com/image/fetch/$s_!1Beb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 848w, https://substackcdn.com/image/fetch/$s_!1Beb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 1272w, https://substackcdn.com/image/fetch/$s_!1Beb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1Beb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png" width="1200" height="1564" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1564,&quot;width&quot;:1200,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:270578,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://softwarebits.substack.com/i/182834019?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!1Beb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 424w, https://substackcdn.com/image/fetch/$s_!1Beb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 848w, https://substackcdn.com/image/fetch/$s_!1Beb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 1272w, https://substackcdn.com/image/fetch/$s_!1Beb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40808d75-4f03-443f-8c0c-e050736e4492_1200x1564.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Every tile might reveal a larger max. The correction factor adjusts all previous work. Nothing needs recomputation&#8212;the associative structure guarantees consistency.</p><h3> The Skill to Develop</h3><p>FlashAttention&#8217;s genius isn&#8217;t tiling or memory tricks.</p><p>It&#8217;s recognizing that softmax has **hidden associative structure**.</p><p>This is a learnable skill. When facing a &#8220;global&#8221; computation:</p><p><em><strong>1. What state do I need?</strong></em></p><p>- Average: (sum, count)</p><p>- Softmax: (max, sum)</p><p>- Your problem: (?, ?)</p><p><em><strong>2. Can partial states combine?</strong></em></p><p>- Write the combine function</p><p>- Check: does order matter?</p><p><em><strong>3. Is correction needed?</strong></em></p><p>- Does new information change the meaning of old state?</p><p>- If so, what&#8217;s the adjustment factor?</p><p><em><strong>4. Is it associative?</strong></em></p><p>- If yes: parallelize, chunk, stream</p><p>- If no: fundamentally different algorithm needed</p><h3>The Counter-Example</h3><p>Not everything has this structure.</p><p><em><strong>Median:</strong></em></p><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;\\text{median}([1, 2, 3]) = 2\n&quot;,&quot;id&quot;:&quot;CRJLNTJDGJ&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;median([4, 5, 6]) = 5&quot;,&quot;id&quot;:&quot;SQQSUKAGJB&quot;}" data-component-name="LatexBlockToDOM"></div><div class="latex-rendered" data-attrs="{&quot;persistentExpression&quot;:&quot;median([1, 2, 3, 4, 5, 6]) = 3.5&quot;,&quot;id&quot;:&quot;PSDREKTAZN&quot;}" data-component-name="LatexBlockToDOM"></div><p>No way to derive 3.5 from 2 and 5. No combinable state exists.</p><p>That&#8217;s why median requires sorting or selection&#8212;fundamentally different algorithms.</p><p>Knowing what <strong>can&#8217;t</strong> be expressed this way is as valuable as knowing what can.</p><h2>The Takeaway</h2><p>FlashAttention works because of a mathematical property.</p><p>Softmax has associative structure hidden beneath its global-looking surface. The (max, scaled_sum) pair combines across chunks. The combination requires correction, but it&#8217;s still associative.</p><p><em><strong>Associativity is the license to parallelize, chunk, and stream.</strong></em></p><p>The property came first. The algorithm followed.</p><p>This is the difference between collecting tricks and understanding foundations. Tricks solve one problem. Properties solve a <strong>category</strong> of problems.</p><p>When you face a seemingly global computation, don&#8217;t reach for a trick.</p><p>Reach for the algebra.</p><p><em>Next week: Why commutativity enables parallelization - and when floating-point arithmetic breaks it.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">If you found this useful, subscribe to get the next article directly in your inbox.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p></p><p>This series will cover the complete algebraic toolkit for ML performance: commutativity, distributivity, linearity, and the domain transformations that make numerical computing stable.</p>]]></content:encoded></item><item><title><![CDATA[PyTorch's compilation and matrix multiplication.]]></title><description><![CDATA[Or a case of missed optimizations]]></description><link>https://softwarebits.substack.com/p/pytorchs-compilation-and-matrix-multiplication</link><guid isPermaLink="false">https://softwarebits.substack.com/p/pytorchs-compilation-and-matrix-multiplication</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sun, 29 Oct 2023 00:20:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ePjo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Introduction</h2><p>PyTorch is a popular open-source machine learning library known for its flexibility and dynamic computation graph. However, when it comes to optimizing certain mathematical operations, it falls short. One example of this is its approach to matrix multiplication, which, in some cases, lacks basic optimizations. In this article, we'll explore PyTorch's shortcomings when it comes to optimizing matrix multiplication and discuss a specific scenario where it doesn't use the most efficient approach.</p><h2><strong>Matrix Multiplication in PyTorch</strong></h2><p>Matrix multiplication is a fundamental operation in various machine learning and scientific computing tasks. It forms the backbone of many deep learning models, including neural networks. To perform matrix multiplication, PyTorch offers several methods, including `torch.mm()`, `torch.matmul()`, and the `@` operator. While these methods are versatile and easy to use, they may not always perform optimally.</p><h2><strong>The Problem with Basic Matrix Multiplication Optimization</strong></h2><p>Matrix multiplication can be a computationally intensive task, especially when dealing with large matrices. In a naive approach to matrix multiplication, to compute the product of two matrices, A and B, you would typically iterate over the rows and columns of the matrices and perform element-wise multiplications and additions. This approach, also known as the standard matrix multiplication algorithm, has a time complexity of O(n^3), where n is the size of the matrices.</p><p>To improve efficiency, more advanced algorithms such as Strassen's algorithm and the Coppersmith&#8211;Winograd algorithm have been developed, which reduce the number of elementary multiplications needed to compute the result. In the context of deep learning, PyTorch utilizes highly optimized and efficient matrix multiplication libraries like Intel MKL or NVIDIA cuBLAS when available, which can significantly speed up these operations.</p><p>However, when it comes to deciding which matrices to optimize, PyTorch can easily miss basic optimization opportunities.</p><h2><strong>An Illustrative Example: Computing the Fourth Power of a Matrix</strong></h2><p>Let's look at a specific example where PyTorch fails to apply a basic optimization. Suppose we want to compute the fourth power of a matrix A. One straightforward approach is to multiply the matrix by itself four times:</p><pre><code>A^4 = A * A * A * A</code></pre><p>In this case, PyTorch's default matrix multiplication method will perform a matrix multiplication three times, resulting in four multiplications, even though it can be done with just two multiplications. This is because PyTorch does not recognize the inherent mathematical symmetry and uses a naively repeated multiplication approach.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ePjo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ePjo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 424w, https://substackcdn.com/image/fetch/$s_!ePjo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 848w, https://substackcdn.com/image/fetch/$s_!ePjo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 1272w, https://substackcdn.com/image/fetch/$s_!ePjo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ePjo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png" width="1372" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:446,&quot;width&quot;:1372,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:96757,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ePjo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 424w, https://substackcdn.com/image/fetch/$s_!ePjo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 848w, https://substackcdn.com/image/fetch/$s_!ePjo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 1272w, https://substackcdn.com/image/fetch/$s_!ePjo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1d169cbe-b2d8-4afb-9a9f-339a7e263bdc_1372x446.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For a random 1000x1000 matrix it takes ~92ms to perform matmul4</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g4kf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g4kf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 424w, https://substackcdn.com/image/fetch/$s_!g4kf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 848w, https://substackcdn.com/image/fetch/$s_!g4kf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 1272w, https://substackcdn.com/image/fetch/$s_!g4kf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g4kf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png" width="1316" height="160" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:160,&quot;width&quot;:1316,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:30271,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!g4kf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 424w, https://substackcdn.com/image/fetch/$s_!g4kf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 848w, https://substackcdn.com/image/fetch/$s_!g4kf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 1272w, https://substackcdn.com/image/fetch/$s_!g4kf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8bd6bf1c-a02b-4ce8-8730-4f51c2bef860_1316x160.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Attentive reader may suggest using pytorch.compile</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ggCc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ggCc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 424w, https://substackcdn.com/image/fetch/$s_!ggCc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 848w, https://substackcdn.com/image/fetch/$s_!ggCc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 1272w, https://substackcdn.com/image/fetch/$s_!ggCc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ggCc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png" width="1372" height="420" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:420,&quot;width&quot;:1372,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87507,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ggCc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 424w, https://substackcdn.com/image/fetch/$s_!ggCc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 848w, https://substackcdn.com/image/fetch/$s_!ggCc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 1272w, https://substackcdn.com/image/fetch/$s_!ggCc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0095120f-4dc8-4eb0-878e-1eb6ed008953_1372x420.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>but, unfortunately, this doesn&#8217;t make much difference</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!33mo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!33mo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 424w, https://substackcdn.com/image/fetch/$s_!33mo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 848w, https://substackcdn.com/image/fetch/$s_!33mo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 1272w, https://substackcdn.com/image/fetch/$s_!33mo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!33mo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png" width="1306" height="146" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:146,&quot;width&quot;:1306,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:29554,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!33mo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 424w, https://substackcdn.com/image/fetch/$s_!33mo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 848w, https://substackcdn.com/image/fetch/$s_!33mo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 1272w, https://substackcdn.com/image/fetch/$s_!33mo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F313aa911-2f76-49c6-a37b-f66da6248c5e_1306x146.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h2><strong>Optimizing the Computation of A^4</strong></h2><p>To compute the fourth power of a matrix more efficiently, one can exploit the properties of matrix exponentiation. Using exponentiation by squaring, you can compute A^4 as follows:</p><pre><code>A^4 = (A^2)^2</code></pre><p>This method reduces the number of matrix multiplications, and in this case, only two multiplications are required: A^2 and (A^2)^2. Using this optimized approach can significantly reduce the computational burden when dealing with large matrices.</p><p>The code to accomplish this is trivial</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8RiB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8RiB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 424w, https://substackcdn.com/image/fetch/$s_!8RiB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 848w, https://substackcdn.com/image/fetch/$s_!8RiB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 1272w, https://substackcdn.com/image/fetch/$s_!8RiB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8RiB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png" width="1372" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:1372,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:103686,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8RiB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 424w, https://substackcdn.com/image/fetch/$s_!8RiB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 848w, https://substackcdn.com/image/fetch/$s_!8RiB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 1272w, https://substackcdn.com/image/fetch/$s_!8RiB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6129e4e4-18dc-4ee4-9c37-20cce6e14f2a_1372x484.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and results in a desired speedup</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P0cz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P0cz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 424w, https://substackcdn.com/image/fetch/$s_!P0cz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 848w, https://substackcdn.com/image/fetch/$s_!P0cz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 1272w, https://substackcdn.com/image/fetch/$s_!P0cz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P0cz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png" width="1296" height="142" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:142,&quot;width&quot;:1296,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:28926,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!P0cz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 424w, https://substackcdn.com/image/fetch/$s_!P0cz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 848w, https://substackcdn.com/image/fetch/$s_!P0cz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 1272w, https://substackcdn.com/image/fetch/$s_!P0cz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1657900-8a55-4090-94dc-3b6512e64cb2_1296x142.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The same can be achieved by using</p><pre><code>torch.matrix_power(mtx, 4)</code></pre><p>that delivers similar performance</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!reiG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!reiG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 424w, https://substackcdn.com/image/fetch/$s_!reiG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 848w, https://substackcdn.com/image/fetch/$s_!reiG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 1272w, https://substackcdn.com/image/fetch/$s_!reiG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!reiG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png" width="1306" height="154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:154,&quot;width&quot;:1306,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:34095,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!reiG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 424w, https://substackcdn.com/image/fetch/$s_!reiG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 848w, https://substackcdn.com/image/fetch/$s_!reiG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 1272w, https://substackcdn.com/image/fetch/$s_!reiG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7db5cc6d-6936-4b9b-b021-3110017589c5_1306x154.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Note that this optimization relies on associativity and since floating point multiplications are non-associative, the result of optimized version is generally not equal to non-optimized one. This doesn&#8217;t mean it&#8217;s not correct and the difference is certainly much smaller than the error introduced by quantization and other hacks that are often employed to speed up learning or inference. On the bright side performance gap between optimized and non-optimized versions grows with matrix dimensions and the power.</p><h2><strong>Conclusion</strong></h2><p>While PyTorch is a powerful and widely used library for deep learning and scientific computing, it's not immune to optimization issues. In the case of matrix multiplication, PyTorch may not always apply the most efficient high-level algorithms. To achieve the best performance in such cases, users must be aware of these limitations and apply their own optimizations when necessary. Understanding the underlying algorithms and mathematical properties is crucial to harnessing PyTorch's full potential and ensuring efficient computation in complex machine learning tasks.</p><p>You can play with above examples using <a href="https://colab.research.google.com/gist/ttsugriy/ffb583d0e0fc9a44ecd0b5c60beed937/pytorch-matmul.ipynb">colab playground</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://softwarebits.substack.com/subscribe?"><span>Subscribe now</span></a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[strcmp vs strncmp]]></title><description><![CDATA[Or why it's useful to know the size.]]></description><link>https://softwarebits.substack.com/p/strcmp-vs-strncmp</link><guid isPermaLink="false">https://softwarebits.substack.com/p/strcmp-vs-strncmp</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 21 Oct 2023 23:03:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!b2Xd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>One of the unfortunate consequences of C-string&#8217;s design that relies on null terminators instead of storing explicit size. Countless buffer overflows and memory corruptions incidents focus on the security aspects of this problem, but today we&#8217;ll look at some performance implications. It&#8217;s easy to see that when comparing for string equality, knowing string sizes helps to skip linear traversal in case they are different but that&#8217;s not all. In C string comparisons can be peformed using <a href="https://en.cppreference.com/w/c/string/byte/strcmp">strcmp</a></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://codebrowser.dev/glibc/glibc/string/strcmp.c.html" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!b2Xd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 424w, https://substackcdn.com/image/fetch/$s_!b2Xd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 848w, https://substackcdn.com/image/fetch/$s_!b2Xd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!b2Xd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!b2Xd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png" width="1282" height="1080" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1080,&quot;width&quot;:1282,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:231172,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://codebrowser.dev/glibc/glibc/string/strcmp.c.html&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!b2Xd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 424w, https://substackcdn.com/image/fetch/$s_!b2Xd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 848w, https://substackcdn.com/image/fetch/$s_!b2Xd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 1272w, https://substackcdn.com/image/fetch/$s_!b2Xd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4fccf5f-7a70-447f-bd4a-578004da6f9f_1282x1080.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Code snippet above from glibc library does exactly what we&#8217;d expect - looks for the first pair of characters that are different and returns their difference. Obviously this code assumes that passed strings are null-terminated and its behavior is undefined otherwise. Oftentimes, at least one of the strings is known at compile-time, so we can bound the number of traversed charecters. <a href="https://en.cppreference.com/w/c/string/byte/strncmp">strncmp</a> accepts a third argument that indicates the maximum number of characters that are used for comparison. It&#8217;s easy to extend strcmp implementation to take into account the maximum number, but interestingly glibc&#8217;s implementation of strncmp looks a little different</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://codebrowser.dev/glibc/glibc/string/strncmp.c.html" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!DC4K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 424w, https://substackcdn.com/image/fetch/$s_!DC4K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 848w, https://substackcdn.com/image/fetch/$s_!DC4K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 1272w, https://substackcdn.com/image/fetch/$s_!DC4K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!DC4K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png" width="1198" height="1974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1974,&quot;width&quot;:1198,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:359848,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://codebrowser.dev/glibc/glibc/string/strncmp.c.html&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!DC4K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 424w, https://substackcdn.com/image/fetch/$s_!DC4K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 848w, https://substackcdn.com/image/fetch/$s_!DC4K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 1272w, https://substackcdn.com/image/fetch/$s_!DC4K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7044bad1-139c-4a8e-a953-503d75607fde_1198x1974.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It does loop unrolling to handle comparisons in blocks of 4. It seems like a reasonable thing to do to reduce the number of n &gt; 0 checks but since it does strictly more work than strcmp it seems like it should be slower, right?</p><p>Let&#8217;s find out.</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist125035580\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-strncmp_vs_strcmp_bench-cpp\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-c  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;C++\&quot; data-tagsearch-path=\&quot;strncmp_vs_strcmp_bench.cpp\&quot;>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>string.h<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span> Compare no more than N characters of S1 and S2,</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;>   returning less than, equal to or greater than zero</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;>   if S1 is lexicographically less than, equal to or</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;>   greater than S2.  <span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>STRNCMP</span> (<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>char</span> *s1, <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>char</span> *s2, <span class=\&quot;pl-c1\&quot;>size_t</span> n)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>{</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> c1 = <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> c2 = <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>if</span> (n &amp;gt;= <span class=\&quot;pl-c1\&quot;>4</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      <span class=\&quot;pl-c1\&quot;>size_t</span> n4 = n &amp;gt;&amp;gt; <span class=\&quot;pl-c1\&quot;>2</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      <span class=\&quot;pl-k\&quot;>do</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t{</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c1 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s1++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c2 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s2++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  <span class=\&quot;pl-k\&quot;>if</span> (c1 == <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span> || c1 != c2)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t    <span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c1 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s1++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c2 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s2++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  <span class=\&quot;pl-k\&quot;>if</span> (c1 == <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span> || c1 != c2)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t    <span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c1 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s1++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c2 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s2++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  <span class=\&quot;pl-k\&quot;>if</span> (c1 == <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span> || c1 != c2)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t    <span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c1 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s1++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  c2 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s2++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t  <span class=\&quot;pl-k\&quot;>if</span> (c1 == <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span> || c1 != c2)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t    <span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t} <span class=\&quot;pl-k\&quot;>while</span> (--n4 &amp;gt; <span class=\&quot;pl-c1\&quot;>0</span>);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      n &amp;amp;= <span class=\&quot;pl-c1\&quot;>3</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>while</span> (n &amp;gt; <span class=\&quot;pl-c1\&quot;>0</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      c1 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s1++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      c2 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s2++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      <span class=\&quot;pl-k\&quot;>if</span> (c1 == <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span> || c1 != c2)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      n--;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span> Compare S1 and S2, returning less than, equal to or</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;>   greater than zero if S1 is lexicographically less than,</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;>   equal to or greater than S2.  <span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>STRCMP</span> (<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>char</span> *p1, <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>char</span> *p2)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>{</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> *s1 = (<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> *) p1;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> *s2 = (<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> *) p2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span> c1, c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>do</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      c1 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s1++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      c2 = (<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>char</span>) *s2++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      <span class=\&quot;pl-k\&quot;>if</span> (c1 == <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;#39;</span><span class=\&quot;pl-cce\&quot;>\\0</span><span class=\&quot;pl-pds\&quot;>&amp;#39;</span></span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>while</span> (c1 == c2);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>return</span> c1 - c2;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L66\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;66\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC66\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L67\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;67\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC67\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>char</span> * name = <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;quot;</span>perf<span class=\&quot;pl-pds\&quot;>&amp;quot;</span></span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L68\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;68\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC68\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L69\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;69\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC69\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>BH_strncmp</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L70\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;70\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC70\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L71\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;71\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC71\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>STRNCMP</span>(name, <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;quot;</span>perf<span class=\&quot;pl-pds\&quot;>&amp;quot;</span></span>, <span class=\&quot;pl-c1\&quot;>5</span>));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L72\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;72\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC72\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L73\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;73\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC73\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L74\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;74\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC74\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(BH_strncmp);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L75\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;75\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC75\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L76\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;76\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC76\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>BH_strcmp</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L77\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;77\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC77\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L78\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;78\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC78\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>STRCMP</span>(name, <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;quot;</span>perf<span class=\&quot;pl-pds\&quot;>&amp;quot;</span></span>));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L79\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;79\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC79\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L80\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;80\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC80\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-L81\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;81\&quot;></td>\n          <td id=\&quot;file-strncmp_vs_strcmp_bench-cpp-LC81\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(BH_strcmp);</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/f603a79f61d11720c14dd8c5923d471c/raw/0599911e097886924f138b5e5cf2b03546d1722f/strncmp_vs_strcmp_bench.cpp\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/f603a79f61d11720c14dd8c5923d471c#file-strncmp_vs_strcmp_bench-cpp\&quot;>\n          strncmp_vs_strcmp_bench.cpp\n        </a>\n        hosted with &amp;#10084; by <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-3c6bff8100e5.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-3c6bff8100e5.css"><div id="gist125035580" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-strncmp_vs_strcmp_bench-cpp" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-c  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="C++" data-tagsearch-path="strncmp_vs_strcmp_bench.cpp">
        <tbody><tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC1" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>string.h<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">/*</span> Compare no more than N characters of S1 and S2,</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC4" class="blob-code blob-code-inner js-file-line"><span class="pl-c">   returning less than, equal to or greater than zero</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-c">   if S1 is lexicographically less than, equal to or</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-c">   greater than S2.  <span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-en">STRNCMP</span> (<span class="pl-k">const</span> <span class="pl-k">char</span> *s1, <span class="pl-k">const</span> <span class="pl-k">char</span> *s2, <span class="pl-c1">size_t</span> n)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC9" class="blob-code blob-code-inner js-file-line">{</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC10" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">unsigned</span> <span class="pl-k">char</span> c1 = <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span>;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC11" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">unsigned</span> <span class="pl-k">char</span> c2 = <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span>;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC12" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">if</span> (n &gt;= <span class="pl-c1">4</span>)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC13" class="blob-code blob-code-inner js-file-line">    {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC14" class="blob-code blob-code-inner js-file-line">      <span class="pl-c1">size_t</span> n4 = n &gt;&gt; <span class="pl-c1">2</span>;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC15" class="blob-code blob-code-inner js-file-line">      <span class="pl-k">do</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC16" class="blob-code blob-code-inner js-file-line">&#9;{</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC17" class="blob-code blob-code-inner js-file-line">&#9;  c1 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s1++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC18" class="blob-code blob-code-inner js-file-line">&#9;  c2 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s2++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC19" class="blob-code blob-code-inner js-file-line">&#9;  <span class="pl-k">if</span> (c1 == <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span> || c1 != c2)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC20" class="blob-code blob-code-inner js-file-line">&#9;    <span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC21" class="blob-code blob-code-inner js-file-line">&#9;  c1 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s1++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC22" class="blob-code blob-code-inner js-file-line">&#9;  c2 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s2++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC23" class="blob-code blob-code-inner js-file-line">&#9;  <span class="pl-k">if</span> (c1 == <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span> || c1 != c2)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC24" class="blob-code blob-code-inner js-file-line">&#9;    <span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC25" class="blob-code blob-code-inner js-file-line">&#9;  c1 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s1++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC26" class="blob-code blob-code-inner js-file-line">&#9;  c2 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s2++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC27" class="blob-code blob-code-inner js-file-line">&#9;  <span class="pl-k">if</span> (c1 == <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span> || c1 != c2)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC28" class="blob-code blob-code-inner js-file-line">&#9;    <span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC29" class="blob-code blob-code-inner js-file-line">&#9;  c1 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s1++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC30" class="blob-code blob-code-inner js-file-line">&#9;  c2 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s2++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC31" class="blob-code blob-code-inner js-file-line">&#9;  <span class="pl-k">if</span> (c1 == <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span> || c1 != c2)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC32" class="blob-code blob-code-inner js-file-line">&#9;    <span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC33" class="blob-code blob-code-inner js-file-line">&#9;} <span class="pl-k">while</span> (--n4 &gt; <span class="pl-c1">0</span>);</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC34" class="blob-code blob-code-inner js-file-line">      n &amp;= <span class="pl-c1">3</span>;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC35" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC36" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">while</span> (n &gt; <span class="pl-c1">0</span>)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC37" class="blob-code blob-code-inner js-file-line">    {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC38" class="blob-code blob-code-inner js-file-line">      c1 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s1++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC39" class="blob-code blob-code-inner js-file-line">      c2 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s2++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC40" class="blob-code blob-code-inner js-file-line">      <span class="pl-k">if</span> (c1 == <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span> || c1 != c2)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC41" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC42" class="blob-code blob-code-inner js-file-line">      n--;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC43" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC44" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC45" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC46" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC47" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">/*</span> Compare S1 and S2, returning less than, equal to or</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC48" class="blob-code blob-code-inner js-file-line"><span class="pl-c">   greater than zero if S1 is lexicographically less than,</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC49" class="blob-code blob-code-inner js-file-line"><span class="pl-c">   equal to or greater than S2.  <span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC50" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC51" class="blob-code blob-code-inner js-file-line"><span class="pl-en">STRCMP</span> (<span class="pl-k">const</span> <span class="pl-k">char</span> *p1, <span class="pl-k">const</span> <span class="pl-k">char</span> *p2)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC52" class="blob-code blob-code-inner js-file-line">{</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC53" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">const</span> <span class="pl-k">unsigned</span> <span class="pl-k">char</span> *s1 = (<span class="pl-k">const</span> <span class="pl-k">unsigned</span> <span class="pl-k">char</span> *) p1;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC54" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">const</span> <span class="pl-k">unsigned</span> <span class="pl-k">char</span> *s2 = (<span class="pl-k">const</span> <span class="pl-k">unsigned</span> <span class="pl-k">char</span> *) p2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC55" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">unsigned</span> <span class="pl-k">char</span> c1, c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC56" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">do</span></td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC57" class="blob-code blob-code-inner js-file-line">    {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC58" class="blob-code blob-code-inner js-file-line">      c1 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s1++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC59" class="blob-code blob-code-inner js-file-line">      c2 = (<span class="pl-k">unsigned</span> <span class="pl-k">char</span>) *s2++;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC60" class="blob-code blob-code-inner js-file-line">      <span class="pl-k">if</span> (c1 == <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\0</span><span class="pl-pds">'</span></span>)</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC61" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC62" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC63" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">while</span> (c1 == c2);</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC64" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">return</span> c1 - c2;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC65" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L66" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="66"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC66" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L67" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="67"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC67" class="blob-code blob-code-inner js-file-line"><span class="pl-k">char</span> * name = <span class="pl-s"><span class="pl-pds">"</span>perf<span class="pl-pds">"</span></span>;</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L68" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="68"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC68" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L69" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="69"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC69" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">BH_strncmp</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L70" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="70"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC70" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L71" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="71"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC71" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">STRNCMP</span>(name, <span class="pl-s"><span class="pl-pds">"</span>perf<span class="pl-pds">"</span></span>, <span class="pl-c1">5</span>));</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L72" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="72"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC72" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L73" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="73"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC73" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L74" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="74"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC74" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(BH_strncmp);</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L75" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="75"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC75" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L76" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="76"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC76" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">BH_strcmp</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L77" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="77"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC77" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L78" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="78"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC78" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">STRCMP</span>(name, <span class="pl-s"><span class="pl-pds">"</span>perf<span class="pl-pds">"</span></span>));</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L79" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="79"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC79" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L80" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="80"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC80" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-strncmp_vs_strcmp_bench-cpp-L81" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="81"></td>
          <td id="file-strncmp_vs_strcmp_bench-cpp-LC81" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(BH_strcmp);</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/f603a79f61d11720c14dd8c5923d471c/raw/0599911e097886924f138b5e5cf2b03546d1722f/strncmp_vs_strcmp_bench.cpp" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/f603a79f61d11720c14dd8c5923d471c#file-strncmp_vs_strcmp_bench-cpp">
          strncmp_vs_strcmp_bench.cpp
        </a>
        hosted with &#10084; by <a class="Link--inTextBlock" href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>And the <a href="https://quick-bench.com/q/ny_mS4qpWjOdQ5XlzYTsnIBP3fQ">results</a> are</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/ny_mS4qpWjOdQ5XlzYTsnIBP3fQ" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Q1Of!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!Q1Of!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!Q1Of!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!Q1Of!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Q1Of!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png" width="1324" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://quick-bench.com/q/ny_mS4qpWjOdQ5XlzYTsnIBP3fQ&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Q1Of!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!Q1Of!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!Q1Of!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!Q1Of!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9abd9cf0-5f2b-4638-96f5-90ec6972767e_1324x662.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>2.2X faster! Don&#8217;t forget that the numbers can be different depending on the inputs, compilers and standard library implementations, so don&#8217;t take my word for it and run your own benchmarks. My main point point is that since strncmp is a little more safe than strcmp performance shouldn&#8217;t be a reason you prefer strcmp over strncmp.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Faster reservoir sampling.]]></title><description><![CDATA[Or taking advantage of better algorithms.]]></description><link>https://softwarebits.substack.com/p/faster-reservoir-sampling</link><guid isPermaLink="false">https://softwarebits.substack.com/p/faster-reservoir-sampling</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 14 Oct 2023 23:33:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mz8D!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Reservoir sampling is a fundamental technique in computer science used for selecting a random sample of items from a large dataset, especially when the size of the dataset is unknown or too large to fit into memory at once. It plays a crucial role in various applications, including data analysis, machine learning, and algorithm design.</p><p>The importance of reservoir sampling lies in its ability to provide a truly random and unbiased sample, regardless of the dataset's size. This characteristic is particularly valuable when dealing with data streams, massive databases, or situations where you need to maintain the statistical integrity of your sample. Reservoir sampling ensures that every item in the dataset has an equal chance of being included in the sample, making it an indispensable tool for designing efficient and accurate algorithms in computer science and data analysis. Whether you're working with big data or designing randomized algorithms, reservoir sampling is a key technique to ensure the robustness and reliability of your results.</p><p>In fact it&#8217;s so important that it used to be a popular coding interview question at largest tech companies. Fortunately its most popular implementation is fairly trivial</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/Teohvh7d6" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mz8D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 424w, https://substackcdn.com/image/fetch/$s_!mz8D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 848w, https://substackcdn.com/image/fetch/$s_!mz8D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!mz8D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mz8D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png" width="1456" height="1105" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1105,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:230816,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/Teohvh7d6&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mz8D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 424w, https://substackcdn.com/image/fetch/$s_!mz8D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 848w, https://substackcdn.com/image/fetch/$s_!mz8D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!mz8D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd8c9bf2e-53ab-47fd-a873-482792b7f43c_1470x1116.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s easy to notice that random number has to be generated for every element from the stream after reservoir is filled. This means that if n &#187; k random generator calls are likely to impact overall performance. What if instead of throwing a dice for every element from the stream to see if it should end up in the reservoir, we could somehow come up with a strategy of skipping certain number of source elements before accepting one into the reservoir. Turns out there is a way. Theory behind such algorithms is tricky but well covered in other <a href="https://richardstartin.github.io/posts/reservoir-sampling">articles</a>, so here I&#8217;ll only consider AlgorithmL because of its simplicity</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/Teohvh7d6" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E1Fr!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 424w, https://substackcdn.com/image/fetch/$s_!E1Fr!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 848w, https://substackcdn.com/image/fetch/$s_!E1Fr!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!E1Fr!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E1Fr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png" width="1456" height="1622" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1622,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:331936,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/Teohvh7d6&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!E1Fr!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 424w, https://substackcdn.com/image/fetch/$s_!E1Fr!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 848w, https://substackcdn.com/image/fetch/$s_!E1Fr!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 1272w, https://substackcdn.com/image/fetch/$s_!E1Fr!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0b3fcd73-aca7-417a-bf4f-e51e9f40740e_1470x1638.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s certainly more involved but not much more code. Is this extra complexity justified though? Let&#8217;s <a href="https://quick-bench.com/q/_7veb-Dlpl8XHXOgIx2H0uiCVa0">see</a></p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist124673977\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-reservoir_bench-cpp\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-c  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;C++\&quot; data-tagsearch-path=\&quot;reservoir_bench.cpp\&quot;>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>algorithm<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>cmath<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>iostream<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>iterator<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>random<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>vector<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>AlgorithmL</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>   <span class=\&quot;pl-k\&quot;>private:</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    std::vector&amp;lt;<span class=\&quot;pl-k\&quot;>double</span>&amp;gt; reservoir;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>long</span> <span class=\&quot;pl-k\&quot;>long</span> counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>long</span> <span class=\&quot;pl-k\&quot;>long</span> next;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>double</span> w;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    std::mt19937_64 rng{};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    std::uniform_real_distribution&amp;lt;<span class=\&quot;pl-k\&quot;>double</span>&amp;gt; unif{<span class=\&quot;pl-c1\&quot;>0</span>, <span class=\&quot;pl-c1\&quot;>1</span>};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>   <span class=\&quot;pl-k\&quot;>public:</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-en\&quot;>AlgorithmL</span>(<span class=\&quot;pl-k\&quot;>int</span> capacity) : reservoir(capacity), counter{<span class=\&quot;pl-c1\&quot;>0</span>}, next{capacity} {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        w = <span class=\&quot;pl-c1\&quot;>exp</span>(<span class=\&quot;pl-c1\&quot;>log</span>(<span class=\&quot;pl-c1\&quot;>std::rand</span>() / (<span class=\&quot;pl-k\&quot;>double</span>)RAND_MAX) / reservoir.<span class=\&quot;pl-c1\&quot;>size</span>());</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=\&quot;pl-c1\&quot;>skip</span>();</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>add</span>(<span class=\&quot;pl-k\&quot;>double</span> value) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=\&quot;pl-k\&quot;>if</span> (counter &amp;lt; reservoir.<span class=\&quot;pl-c1\&quot;>size</span>()) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            reservoir[counter] = value;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        } <span class=\&quot;pl-k\&quot;>else</span> <span class=\&quot;pl-k\&quot;>if</span> (counter == next) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-c1\&quot;>index</span> = <span class=\&quot;pl-c1\&quot;>std::rand</span>() % reservoir.<span class=\&quot;pl-c1\&quot;>size</span>();</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            reservoir[<span class=\&quot;pl-c1\&quot;>index</span>] = value;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=\&quot;pl-c1\&quot;>skip</span>();</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        ++counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>auto</span> <span class=\&quot;pl-en\&quot;>sample</span>() { <span class=\&quot;pl-k\&quot;>return</span> reservoir; }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>   <span class=\&quot;pl-k\&quot;>private:</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>skip</span>() {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        next += (<span class=\&quot;pl-k\&quot;>long</span> <span class=\&quot;pl-k\&quot;>long</span>)(<span class=\&quot;pl-c1\&quot;>log</span>(<span class=\&quot;pl-c1\&quot;>unif</span>(rng)) / <span class=\&quot;pl-c1\&quot;>log</span>(<span class=\&quot;pl-c1\&quot;>1</span> - w)) + <span class=\&quot;pl-c1\&quot;>1</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        w *= <span class=\&quot;pl-c1\&quot;>exp</span>(<span class=\&quot;pl-c1\&quot;>log</span>(<span class=\&quot;pl-c1\&quot;>unif</span>(rng)) / reservoir.<span class=\&quot;pl-c1\&quot;>size</span>());</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>AlgorithmR</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>   <span class=\&quot;pl-k\&quot;>private:</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    std::vector&amp;lt;<span class=\&quot;pl-k\&quot;>double</span>&amp;gt; reservoir;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>long</span> <span class=\&quot;pl-k\&quot;>long</span> counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>   <span class=\&quot;pl-k\&quot;>public:</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-en\&quot;>AlgorithmR</span>(<span class=\&quot;pl-k\&quot;>int</span> capacity) : reservoir(capacity), counter{<span class=\&quot;pl-c1\&quot;>0</span>} {}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>add</span>(<span class=\&quot;pl-k\&quot;>double</span> value) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=\&quot;pl-k\&quot;>if</span> (counter &amp;lt; reservoir.<span class=\&quot;pl-c1\&quot;>size</span>()) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            reservoir[counter] = value;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        } <span class=\&quot;pl-k\&quot;>else</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=\&quot;pl-k\&quot;>long</span> <span class=\&quot;pl-k\&quot;>long</span> replacementIndex = <span class=\&quot;pl-c1\&quot;>std::rand</span>() % counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=\&quot;pl-k\&quot;>if</span> (replacementIndex &amp;lt; reservoir.<span class=\&quot;pl-c1\&quot;>size</span>()) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                reservoir[replacementIndex] = value;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        ++counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>auto</span> <span class=\&quot;pl-en\&quot;>sample</span>() { <span class=\&quot;pl-k\&quot;>return</span> reservoir; }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>BH_algoR</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>auto</span> k = <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>int</span>&amp;gt;(state.<span class=\&quot;pl-c1\&quot;>range</span>(<span class=\&quot;pl-c1\&quot;>0</span>));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L66\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;66\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC66\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  AlgorithmR algoR{k};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L67\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;67\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC67\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>double</span> d = <span class=\&quot;pl-c1\&quot;>0.0</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L68\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;68\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC68\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L69\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;69\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC69\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    algoR.<span class=\&quot;pl-c1\&quot;>add</span>(d++);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L70\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;70\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC70\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L71\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;71\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC71\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L72\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;72\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC72\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(BH_algoR)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>5</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>20</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>200</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>1000</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>10000</span>);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L73\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;73\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC73\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L74\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;74\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC74\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>BH_algoL</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L75\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;75\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC75\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>auto</span> k = <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>int</span>&amp;gt;(state.<span class=\&quot;pl-c1\&quot;>range</span>(<span class=\&quot;pl-c1\&quot;>0</span>));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L76\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;76\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC76\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  AlgorithmL algoL{k};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L77\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;77\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC77\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>double</span> d = <span class=\&quot;pl-c1\&quot;>0.0</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L78\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;78\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC78\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L79\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;79\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC79\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    algoL.<span class=\&quot;pl-c1\&quot;>add</span>(d++);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L80\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;80\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC80\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L81\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;81\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC81\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-reservoir_bench-cpp-L82\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;82\&quot;></td>\n          <td id=\&quot;file-reservoir_bench-cpp-LC82\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(BH_algoL)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>5</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>20</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>200</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>1000</span>)-&amp;gt;Arg(<span class=\&quot;pl-c1\&quot;>10000</span>);</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/9dece74b8ddee0802d834dd779d38bd1/raw/e853616073307f36f926b0e386e96b872460dc3e/reservoir_bench.cpp\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/9dece74b8ddee0802d834dd779d38bd1#file-reservoir_bench-cpp\&quot;>\n          reservoir_bench.cpp\n        </a>\n        hosted with &amp;#10084; by <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-0e9bf67cc0c6.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-0e9bf67cc0c6.css"><div id="gist124673977" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-reservoir_bench-cpp" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-c  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="C++" data-tagsearch-path="reservoir_bench.cpp">
        <tbody><tr>
          <td id="file-reservoir_bench-cpp-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-reservoir_bench-cpp-LC1" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>algorithm<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-reservoir_bench-cpp-LC2" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>cmath<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-reservoir_bench-cpp-LC3" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>iostream<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-reservoir_bench-cpp-LC4" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>iterator<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-reservoir_bench-cpp-LC5" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>random<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-reservoir_bench-cpp-LC6" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>vector<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-reservoir_bench-cpp-LC7" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-reservoir_bench-cpp-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">AlgorithmL</span> {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-reservoir_bench-cpp-LC9" class="blob-code blob-code-inner js-file-line">   <span class="pl-k">private:</span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-reservoir_bench-cpp-LC10" class="blob-code blob-code-inner js-file-line">    std::vector&lt;<span class="pl-k">double</span>&gt; reservoir;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-reservoir_bench-cpp-LC11" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">long</span> <span class="pl-k">long</span> counter;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-reservoir_bench-cpp-LC12" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">long</span> <span class="pl-k">long</span> next;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-reservoir_bench-cpp-LC13" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">double</span> w;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-reservoir_bench-cpp-LC14" class="blob-code blob-code-inner js-file-line">    std::mt19937_64 rng{};</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-reservoir_bench-cpp-LC15" class="blob-code blob-code-inner js-file-line">    std::uniform_real_distribution&lt;<span class="pl-k">double</span>&gt; unif{<span class="pl-c1">0</span>, <span class="pl-c1">1</span>};</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-reservoir_bench-cpp-LC16" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-reservoir_bench-cpp-LC17" class="blob-code blob-code-inner js-file-line">   <span class="pl-k">public:</span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-reservoir_bench-cpp-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-en">AlgorithmL</span>(<span class="pl-k">int</span> capacity) : reservoir(capacity), counter{<span class="pl-c1">0</span>}, next{capacity} {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-reservoir_bench-cpp-LC19" class="blob-code blob-code-inner js-file-line">        w = <span class="pl-c1">exp</span>(<span class="pl-c1">log</span>(<span class="pl-c1">std::rand</span>() / (<span class="pl-k">double</span>)RAND_MAX) / reservoir.<span class="pl-c1">size</span>());</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-reservoir_bench-cpp-LC20" class="blob-code blob-code-inner js-file-line">        <span class="pl-c1">skip</span>();</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-reservoir_bench-cpp-LC21" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-reservoir_bench-cpp-LC22" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-reservoir_bench-cpp-LC23" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">void</span> <span class="pl-en">add</span>(<span class="pl-k">double</span> value) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-reservoir_bench-cpp-LC24" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> (counter &lt; reservoir.<span class="pl-c1">size</span>()) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-reservoir_bench-cpp-LC25" class="blob-code blob-code-inner js-file-line">            reservoir[counter] = value;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-reservoir_bench-cpp-LC26" class="blob-code blob-code-inner js-file-line">        } <span class="pl-k">else</span> <span class="pl-k">if</span> (counter == next) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-reservoir_bench-cpp-LC27" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">int</span> <span class="pl-c1">index</span> = <span class="pl-c1">std::rand</span>() % reservoir.<span class="pl-c1">size</span>();</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-reservoir_bench-cpp-LC28" class="blob-code blob-code-inner js-file-line">            reservoir[<span class="pl-c1">index</span>] = value;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-reservoir_bench-cpp-LC29" class="blob-code blob-code-inner js-file-line">            <span class="pl-c1">skip</span>();</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-reservoir_bench-cpp-LC30" class="blob-code blob-code-inner js-file-line">        }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-reservoir_bench-cpp-LC31" class="blob-code blob-code-inner js-file-line">        ++counter;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-reservoir_bench-cpp-LC32" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-reservoir_bench-cpp-LC33" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">auto</span> <span class="pl-en">sample</span>() { <span class="pl-k">return</span> reservoir; }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-reservoir_bench-cpp-LC34" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-reservoir_bench-cpp-LC35" class="blob-code blob-code-inner js-file-line">   <span class="pl-k">private:</span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-reservoir_bench-cpp-LC36" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">void</span> <span class="pl-en">skip</span>() {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-reservoir_bench-cpp-LC37" class="blob-code blob-code-inner js-file-line">        next += (<span class="pl-k">long</span> <span class="pl-k">long</span>)(<span class="pl-c1">log</span>(<span class="pl-c1">unif</span>(rng)) / <span class="pl-c1">log</span>(<span class="pl-c1">1</span> - w)) + <span class="pl-c1">1</span>;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-reservoir_bench-cpp-LC38" class="blob-code blob-code-inner js-file-line">        w *= <span class="pl-c1">exp</span>(<span class="pl-c1">log</span>(<span class="pl-c1">unif</span>(rng)) / reservoir.<span class="pl-c1">size</span>());</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-reservoir_bench-cpp-LC39" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-reservoir_bench-cpp-LC40" class="blob-code blob-code-inner js-file-line">};</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-reservoir_bench-cpp-LC41" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-reservoir_bench-cpp-LC42" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">AlgorithmR</span> {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-reservoir_bench-cpp-LC43" class="blob-code blob-code-inner js-file-line">   <span class="pl-k">private:</span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-reservoir_bench-cpp-LC44" class="blob-code blob-code-inner js-file-line">    std::vector&lt;<span class="pl-k">double</span>&gt; reservoir;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-reservoir_bench-cpp-LC45" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">long</span> <span class="pl-k">long</span> counter;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-reservoir_bench-cpp-LC46" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-reservoir_bench-cpp-LC47" class="blob-code blob-code-inner js-file-line">   <span class="pl-k">public:</span></td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-reservoir_bench-cpp-LC48" class="blob-code blob-code-inner js-file-line">    <span class="pl-en">AlgorithmR</span>(<span class="pl-k">int</span> capacity) : reservoir(capacity), counter{<span class="pl-c1">0</span>} {}</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-reservoir_bench-cpp-LC49" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-reservoir_bench-cpp-LC50" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">void</span> <span class="pl-en">add</span>(<span class="pl-k">double</span> value) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-reservoir_bench-cpp-LC51" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> (counter &lt; reservoir.<span class="pl-c1">size</span>()) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-reservoir_bench-cpp-LC52" class="blob-code blob-code-inner js-file-line">            reservoir[counter] = value;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-reservoir_bench-cpp-LC53" class="blob-code blob-code-inner js-file-line">        } <span class="pl-k">else</span> {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-reservoir_bench-cpp-LC54" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">long</span> <span class="pl-k">long</span> replacementIndex = <span class="pl-c1">std::rand</span>() % counter;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-reservoir_bench-cpp-LC55" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">if</span> (replacementIndex &lt; reservoir.<span class="pl-c1">size</span>()) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-reservoir_bench-cpp-LC56" class="blob-code blob-code-inner js-file-line">                reservoir[replacementIndex] = value;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-reservoir_bench-cpp-LC57" class="blob-code blob-code-inner js-file-line">            }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-reservoir_bench-cpp-LC58" class="blob-code blob-code-inner js-file-line">        }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-reservoir_bench-cpp-LC59" class="blob-code blob-code-inner js-file-line">        ++counter;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-reservoir_bench-cpp-LC60" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-reservoir_bench-cpp-LC61" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">auto</span> <span class="pl-en">sample</span>() { <span class="pl-k">return</span> reservoir; }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-reservoir_bench-cpp-LC62" class="blob-code blob-code-inner js-file-line">};</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-reservoir_bench-cpp-LC63" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-reservoir_bench-cpp-LC64" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">BH_algoR</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-reservoir_bench-cpp-LC65" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">auto</span> k = <span class="pl-k">static_cast</span>&lt;<span class="pl-k">int</span>&gt;(state.<span class="pl-c1">range</span>(<span class="pl-c1">0</span>));</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L66" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="66"></td>
          <td id="file-reservoir_bench-cpp-LC66" class="blob-code blob-code-inner js-file-line">  AlgorithmR algoR{k};</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L67" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="67"></td>
          <td id="file-reservoir_bench-cpp-LC67" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">double</span> d = <span class="pl-c1">0.0</span>;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L68" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="68"></td>
          <td id="file-reservoir_bench-cpp-LC68" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L69" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="69"></td>
          <td id="file-reservoir_bench-cpp-LC69" class="blob-code blob-code-inner js-file-line">    algoR.<span class="pl-c1">add</span>(d++);</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L70" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="70"></td>
          <td id="file-reservoir_bench-cpp-LC70" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L71" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="71"></td>
          <td id="file-reservoir_bench-cpp-LC71" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L72" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="72"></td>
          <td id="file-reservoir_bench-cpp-LC72" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(BH_algoR)-&gt;Arg(<span class="pl-c1">5</span>)-&gt;Arg(<span class="pl-c1">20</span>)-&gt;Arg(<span class="pl-c1">200</span>)-&gt;Arg(<span class="pl-c1">1000</span>)-&gt;Arg(<span class="pl-c1">10000</span>);</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L73" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="73"></td>
          <td id="file-reservoir_bench-cpp-LC73" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L74" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="74"></td>
          <td id="file-reservoir_bench-cpp-LC74" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">BH_algoL</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L75" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="75"></td>
          <td id="file-reservoir_bench-cpp-LC75" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">auto</span> k = <span class="pl-k">static_cast</span>&lt;<span class="pl-k">int</span>&gt;(state.<span class="pl-c1">range</span>(<span class="pl-c1">0</span>));</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L76" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="76"></td>
          <td id="file-reservoir_bench-cpp-LC76" class="blob-code blob-code-inner js-file-line">  AlgorithmL algoL{k};</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L77" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="77"></td>
          <td id="file-reservoir_bench-cpp-LC77" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">double</span> d = <span class="pl-c1">0.0</span>;</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L78" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="78"></td>
          <td id="file-reservoir_bench-cpp-LC78" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L79" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="79"></td>
          <td id="file-reservoir_bench-cpp-LC79" class="blob-code blob-code-inner js-file-line">    algoL.<span class="pl-c1">add</span>(d++);</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L80" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="80"></td>
          <td id="file-reservoir_bench-cpp-LC80" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L81" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="81"></td>
          <td id="file-reservoir_bench-cpp-LC81" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-reservoir_bench-cpp-L82" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="82"></td>
          <td id="file-reservoir_bench-cpp-LC82" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(BH_algoL)-&gt;Arg(<span class="pl-c1">5</span>)-&gt;Arg(<span class="pl-c1">20</span>)-&gt;Arg(<span class="pl-c1">200</span>)-&gt;Arg(<span class="pl-c1">1000</span>)-&gt;Arg(<span class="pl-c1">10000</span>);</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/9dece74b8ddee0802d834dd779d38bd1/raw/e853616073307f36f926b0e386e96b872460dc3e/reservoir_bench.cpp" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/9dece74b8ddee0802d834dd779d38bd1#file-reservoir_bench-cpp">
          reservoir_bench.cpp
        </a>
        hosted with &#10084; by <a class="Link--inTextBlock" href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>and the results look very promising with ~20X speedup.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/_7veb-Dlpl8XHXOgIx2H0uiCVa0" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Wu81!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!Wu81!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!Wu81!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!Wu81!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Wu81!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png" width="1324" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:52175,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://quick-bench.com/q/_7veb-Dlpl8XHXOgIx2H0uiCVa0&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Wu81!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!Wu81!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!Wu81!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!Wu81!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F789fee46-f562-4d74-9dac-e6d46f4294eb_1324x662.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Better algorithms can bring impressive wins, so it never hurts to follow the latest research papers.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Vectorizing utf8_length_from_utf32.]]></title><description><![CDATA[Or vectorization != better performance.]]></description><link>https://softwarebits.substack.com/p/vectorizing-utf8_length_from_utf32</link><guid isPermaLink="false">https://softwarebits.substack.com/p/vectorizing-utf8_length_from_utf32</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 07 Oct 2023 23:14:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!46wC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Daniel Lemire is a unique instance of first-principle thinking in the world of performance. Instead chasing incremental improvements over existing algorithms he uses hardware characteristics to establish theoretical limits and then designs an algorithms to hit them. The most famous example of his work is a <a href="https://simdjson.org/">simdjson library.</a> To better appreciate his work, recently I&#8217;ve been reading code of Daniel&#8217;s other libraries and stumbled upon a function to calculate UTF8 length for the UTF32 encoded string.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://compiler-explorer.com/z/6TE8nYe8K" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!46wC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 424w, https://substackcdn.com/image/fetch/$s_!46wC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 848w, https://substackcdn.com/image/fetch/$s_!46wC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 1272w, https://substackcdn.com/image/fetch/$s_!46wC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!46wC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png" width="1382" height="1266" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1266,&quot;width&quot;:1382,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:239389,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://compiler-explorer.com/z/6TE8nYe8K&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!46wC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 424w, https://substackcdn.com/image/fetch/$s_!46wC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 848w, https://substackcdn.com/image/fetch/$s_!46wC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 1272w, https://substackcdn.com/image/fetch/$s_!46wC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5c6ede26-9b0e-41a3-8b9d-ed06b2912305_1382x1266.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It&#8217;s not a secret that branching is not particularly performance friendly - it complicates life to optimizer and creates more work for branch predictor. This code is translated into very much expected</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://compiler-explorer.com/z/6TE8nYe8K" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MvQ5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 424w, https://substackcdn.com/image/fetch/$s_!MvQ5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 848w, https://substackcdn.com/image/fetch/$s_!MvQ5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 1272w, https://substackcdn.com/image/fetch/$s_!MvQ5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MvQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png" width="1382" height="1712" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1712,&quot;width&quot;:1382,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:263544,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://compiler-explorer.com/z/6TE8nYe8K&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MvQ5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 424w, https://substackcdn.com/image/fetch/$s_!MvQ5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 848w, https://substackcdn.com/image/fetch/$s_!MvQ5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 1272w, https://substackcdn.com/image/fetch/$s_!MvQ5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F19f190a7-6d44-4c8d-9c52-798dfc5b427e_1382x1712.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>with cmp and branch used for each if.</p><p>After staring at this code for a few seconds I&#8217;ve noticed that it follows a fairly predictable pattern - each chat32_t goes through a ladder with each step adding +1 to final utf8 length. It&#8217;s easier to see this in code</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://compiler-explorer.com/z/6TE8nYe8K" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xCAQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 424w, https://substackcdn.com/image/fetch/$s_!xCAQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 848w, https://substackcdn.com/image/fetch/$s_!xCAQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 1272w, https://substackcdn.com/image/fetch/$s_!xCAQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xCAQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png" width="1456" height="921" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:921,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:232577,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://compiler-explorer.com/z/6TE8nYe8K&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xCAQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 424w, https://substackcdn.com/image/fetch/$s_!xCAQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 848w, https://substackcdn.com/image/fetch/$s_!xCAQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 1272w, https://substackcdn.com/image/fetch/$s_!xCAQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdfe755f7-c681-419f-9279-a8d7f72c6f83_1470x930.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Note that this implementation is branchless - we just add 0 or 1 depending on whether current character exceeds certain threshold. This straightforward implementation is much easier for compiler to grok, so it figures that it&#8217;s possible to vectorize it</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://compiler-explorer.com/z/6TE8nYe8K" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TSxX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 424w, https://substackcdn.com/image/fetch/$s_!TSxX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 848w, https://substackcdn.com/image/fetch/$s_!TSxX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 1272w, https://substackcdn.com/image/fetch/$s_!TSxX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TSxX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png" width="1456" height="5715" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:5715,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:952014,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://compiler-explorer.com/z/6TE8nYe8K&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TSxX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 424w, https://substackcdn.com/image/fetch/$s_!TSxX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 848w, https://substackcdn.com/image/fetch/$s_!TSxX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 1272w, https://substackcdn.com/image/fetch/$s_!TSxX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7d6bc170-f4b3-4d43-97ad-848090572bf0_1470x5770.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Sure, it&#8217;s more verbose but we are now using the power of SIMD, right?</p><p>Let&#8217;s see</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist124511247\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-utf8_length_from_utf32_bench-cpp\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-c  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;C++\&quot; data-tagsearch-path=\&quot;utf8_length_from_utf32_bench.cpp\&quot;>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>cstddef<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>cstdint<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>cuchar<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c1\&quot;>size_t</span> <span class=\&quot;pl-en\&quot;>utf8_length_from_utf32</span>(<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>char32_t</span>* buf, <span class=\&quot;pl-c1\&quot;>size_t</span> len) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>//</span> We are not BOM aware.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>uint32_t</span>* p = <span class=\&quot;pl-k\&quot;>reinterpret_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>uint32_t</span>*&amp;gt;(buf);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-c1\&quot;>size_t</span> counter{<span class=\&quot;pl-c1\&quot;>0</span>};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-c1\&quot;>size_t</span> i = <span class=\&quot;pl-c1\&quot;>0</span>; i &amp;lt; len; i++) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* ASCII *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>if</span> (p[i] &amp;lt;= <span class=\&quot;pl-c1\&quot;>0x7F</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      counter++;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* two-byte *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>else</span> <span class=\&quot;pl-k\&quot;>if</span> (p[i] &amp;lt;= <span class=\&quot;pl-c1\&quot;>0x7FF</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      counter += <span class=\&quot;pl-c1\&quot;>2</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* three-byte *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>else</span> <span class=\&quot;pl-k\&quot;>if</span> (p[i] &amp;lt;= <span class=\&quot;pl-c1\&quot;>0xFFFF</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      counter += <span class=\&quot;pl-c1\&quot;>3</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* four-bytes *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>else</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      counter += <span class=\&quot;pl-c1\&quot;>4</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>return</span> counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c1\&quot;>size_t</span> <span class=\&quot;pl-en\&quot;>utf8_length_from_utf32v</span>(<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>char32_t</span>* buf, <span class=\&quot;pl-c1\&quot;>size_t</span> len) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>//</span> We are not BOM aware.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>uint32_t</span>* p = <span class=\&quot;pl-k\&quot;>reinterpret_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>uint32_t</span>*&amp;gt;(buf);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-c1\&quot;>size_t</span> counter{<span class=\&quot;pl-c1\&quot;>0</span>};</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-c1\&quot;>size_t</span> i = <span class=\&quot;pl-c1\&quot;>0</span>; i &amp;lt; len; i++) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    ++counter; <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* ASCII *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    counter += <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-c1\&quot;>size_t</span>&amp;gt;(p[i] &amp;gt; <span class=\&quot;pl-c1\&quot;>0x7F</span>); <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* two-byte *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    counter += <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-c1\&quot;>size_t</span>&amp;gt;(p[i] &amp;gt; <span class=\&quot;pl-c1\&quot;>0x7FF</span>); <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* three-byte *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    counter += <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-c1\&quot;>size_t</span>&amp;gt;(p[i] &amp;gt; <span class=\&quot;pl-c1\&quot;>0xFFFF</span>); <span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>/*</span>* four-bytes *<span class=\&quot;pl-c\&quot;>*/</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>return</span> counter;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>char32_t</span> text[] = <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>U&amp;quot;</span>eckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wf<span class=\&quot;pl-pds\&quot;>&amp;quot;</span></span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-c\&quot;><span class=\&quot;pl-c\&quot;>//</span> const char32_t text[] = U&amp;quot;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;&amp;quot;;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>BH_length</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>auto</span> text = (<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>char32_t</span> *)state.<span class=\&quot;pl-c1\&quot;>range</span>(<span class=\&quot;pl-c1\&quot;>0</span>);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>utf8_length_from_utf32</span>(text, <span class=\&quot;pl-c1\&quot;>129</span>));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(BH_length)-&amp;gt;Arg((<span class=\&quot;pl-c1\&quot;>int64_t</span>)text);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>BH_lengthVec</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-k\&quot;>auto</span> text = (<span class=\&quot;pl-k\&quot;>const</span> <span class=\&quot;pl-c1\&quot;>char32_t</span> *)state.<span class=\&quot;pl-c1\&quot;>range</span>(<span class=\&quot;pl-c1\&quot;>0</span>);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>utf8_length_from_utf32v</span>(text, <span class=\&quot;pl-c1\&quot;>129</span>));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-utf8_length_from_utf32_bench-cpp-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(BH_lengthVec)-&amp;gt;Arg((<span class=\&quot;pl-c1\&quot;>int64_t</span>)text);</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/be4597c93f0c3b89cc91708cae2e7111/raw/d5745d76eee0c3f4b25d05e5834d35b1bdc52582/utf8_length_from_utf32_bench.cpp\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/be4597c93f0c3b89cc91708cae2e7111#file-utf8_length_from_utf32_bench-cpp\&quot;>\n          utf8_length_from_utf32_bench.cpp\n        </a>\n        hosted with &amp;#10084; by <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-0e9bf67cc0c6.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-0e9bf67cc0c6.css"><div id="gist124511247" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-utf8_length_from_utf32_bench-cpp" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-c  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="C++" data-tagsearch-path="utf8_length_from_utf32_bench.cpp">
        <tbody><tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC1" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>cstddef<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC2" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>cstdint<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC3" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>cuchar<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC4" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">size_t</span> <span class="pl-en">utf8_length_from_utf32</span>(<span class="pl-k">const</span> <span class="pl-c1">char32_t</span>* buf, <span class="pl-c1">size_t</span> len) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC6" class="blob-code blob-code-inner js-file-line">  <span class="pl-c"><span class="pl-c">//</span> We are not BOM aware.</span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC7" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">const</span> <span class="pl-c1">uint32_t</span>* p = <span class="pl-k">reinterpret_cast</span>&lt;<span class="pl-k">const</span> <span class="pl-c1">uint32_t</span>*&gt;(buf);</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC8" class="blob-code blob-code-inner js-file-line">  <span class="pl-c1">size_t</span> counter{<span class="pl-c1">0</span>};</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC9" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-c1">size_t</span> i = <span class="pl-c1">0</span>; i &lt; len; i++) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-c"><span class="pl-c">/*</span>* ASCII *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC11" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">if</span> (p[i] &lt;= <span class="pl-c1">0x7F</span>) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC12" class="blob-code blob-code-inner js-file-line">      counter++;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC13" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC14" class="blob-code blob-code-inner js-file-line">    <span class="pl-c"><span class="pl-c">/*</span>* two-byte *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC15" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">else</span> <span class="pl-k">if</span> (p[i] &lt;= <span class="pl-c1">0x7FF</span>) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC16" class="blob-code blob-code-inner js-file-line">      counter += <span class="pl-c1">2</span>;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC17" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-c"><span class="pl-c">/*</span>* three-byte *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC19" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">else</span> <span class="pl-k">if</span> (p[i] &lt;= <span class="pl-c1">0xFFFF</span>) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC20" class="blob-code blob-code-inner js-file-line">      counter += <span class="pl-c1">3</span>;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC21" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC22" class="blob-code blob-code-inner js-file-line">    <span class="pl-c"><span class="pl-c">/*</span>* four-bytes *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC23" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">else</span> {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC24" class="blob-code blob-code-inner js-file-line">      counter += <span class="pl-c1">4</span>;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC25" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC26" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC27" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">return</span> counter;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC28" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC29" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC30" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">size_t</span> <span class="pl-en">utf8_length_from_utf32v</span>(<span class="pl-k">const</span> <span class="pl-c1">char32_t</span>* buf, <span class="pl-c1">size_t</span> len) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC31" class="blob-code blob-code-inner js-file-line">  <span class="pl-c"><span class="pl-c">//</span> We are not BOM aware.</span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC32" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">const</span> <span class="pl-c1">uint32_t</span>* p = <span class="pl-k">reinterpret_cast</span>&lt;<span class="pl-k">const</span> <span class="pl-c1">uint32_t</span>*&gt;(buf);</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC33" class="blob-code blob-code-inner js-file-line">  <span class="pl-c1">size_t</span> counter{<span class="pl-c1">0</span>};</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC34" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-c1">size_t</span> i = <span class="pl-c1">0</span>; i &lt; len; i++) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC35" class="blob-code blob-code-inner js-file-line">    ++counter; <span class="pl-c"><span class="pl-c">/*</span>* ASCII *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC36" class="blob-code blob-code-inner js-file-line">    counter += <span class="pl-k">static_cast</span>&lt;<span class="pl-c1">size_t</span>&gt;(p[i] &gt; <span class="pl-c1">0x7F</span>); <span class="pl-c"><span class="pl-c">/*</span>* two-byte *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC37" class="blob-code blob-code-inner js-file-line">    counter += <span class="pl-k">static_cast</span>&lt;<span class="pl-c1">size_t</span>&gt;(p[i] &gt; <span class="pl-c1">0x7FF</span>); <span class="pl-c"><span class="pl-c">/*</span>* three-byte *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC38" class="blob-code blob-code-inner js-file-line">    counter += <span class="pl-k">static_cast</span>&lt;<span class="pl-c1">size_t</span>&gt;(p[i] &gt; <span class="pl-c1">0xFFFF</span>); <span class="pl-c"><span class="pl-c">/*</span>* four-bytes *<span class="pl-c">*/</span></span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC39" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC40" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">return</span> counter;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC41" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC42" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC43" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-c1">char32_t</span> text[] = <span class="pl-s"><span class="pl-pds">U"</span>eckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wfeckwd4c7cu47r2wf<span class="pl-pds">"</span></span>;</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC44" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">//</span> const char32_t text[] = U"Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;Maji&#12391;Koi&#12377;&#12427;5&#31186;&#21069;";</span></td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC45" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC46" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">BH_length</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC47" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">const</span> <span class="pl-k">auto</span> text = (<span class="pl-k">const</span> <span class="pl-c1">char32_t</span> *)state.<span class="pl-c1">range</span>(<span class="pl-c1">0</span>);</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC48" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC49" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">utf8_length_from_utf32</span>(text, <span class="pl-c1">129</span>));</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC50" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC51" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC52" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(BH_length)-&gt;Arg((<span class="pl-c1">int64_t</span>)text);</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC53" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC54" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">BH_lengthVec</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC55" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">const</span> <span class="pl-k">auto</span> text = (<span class="pl-k">const</span> <span class="pl-c1">char32_t</span> *)state.<span class="pl-c1">range</span>(<span class="pl-c1">0</span>);</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC56" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC57" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">utf8_length_from_utf32v</span>(text, <span class="pl-c1">129</span>));</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC58" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC59" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-utf8_length_from_utf32_bench-cpp-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-utf8_length_from_utf32_bench-cpp-LC60" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(BH_lengthVec)-&gt;Arg((<span class="pl-c1">int64_t</span>)text);</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/be4597c93f0c3b89cc91708cae2e7111/raw/d5745d76eee0c3f4b25d05e5834d35b1bdc52582/utf8_length_from_utf32_bench.cpp" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/be4597c93f0c3b89cc91708cae2e7111#file-utf8_length_from_utf32_bench-cpp">
          utf8_length_from_utf32_bench.cpp
        </a>
        hosted with &#10084; by <a class="Link--inTextBlock" href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>And the <a href="https://quick-bench.com/q/h8vhPwyGhbkt40vV8f8QKyeAjt4">results</a> are</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/h8vhPwyGhbkt40vV8f8QKyeAjt4" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HXCW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!HXCW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!HXCW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!HXCW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HXCW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png" width="1324" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://quick-bench.com/q/h8vhPwyGhbkt40vV8f8QKyeAjt4&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HXCW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!HXCW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!HXCW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!HXCW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc134a7fc-0c5b-43fe-a854-4d66bec5e469_1324x662.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What a bummer! For regular ASCII string we take a significant performance hit. For mixed unicode strings results are not as bad</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/qfWR8mtAgbuxcQABzBfbvLU5dvE" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uI68!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!uI68!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!uI68!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!uI68!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uI68!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png" width="1324" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://quick-bench.com/q/qfWR8mtAgbuxcQABzBfbvLU5dvE&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uI68!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!uI68!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!uI68!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!uI68!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1a89070d-6030-4785-a1ed-f8e327a999f3_1324x662.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>but still not something we were hoping for.</p><p>My attempt landed in ada-url as part of https://github.com/ada-url/idna/pull/33 but the lesson here is - don&#8217;t assume SIMD is always magically better and trust only benchmarks using representative inputs.</p><p>You can look for the answer &#8220;why&#8221; using tools like <a href="https://uica.uops.info/">uiCA</a> or reading hardware manuals but at the end of the day what matters is measured result.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Fast has_hex_prefix check.]]></title><description><![CDATA[Or SIMD using uint16_t.]]></description><link>https://softwarebits.substack.com/p/fast-has_hex_prefix-check</link><guid isPermaLink="false">https://softwarebits.substack.com/p/fast-has_hex_prefix-check</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 30 Sep 2023 23:57:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Vectorized programming is a programming technique that uses vector instructions to perform operations on multiple data points at the same time. This can significantly improve the performance of programs that work with large amounts of data. Vector instructions are available on most modern CPUs. They allow the CPU to perform multiple operations on a single data stream in parallel. This can be much faster than performing the operations one at a time.</p><p>When it comes to SIMD, we usually think about SSE*, AVX and Neon, but vectorization has been used for years before any of them appeared. Let&#8217;s take a look at a common parsing subroutine to check if string has a hex prefix &#8216;0x&#8217;. The first thing that comes to mind is something like</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sHhy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sHhy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 424w, https://substackcdn.com/image/fetch/$s_!sHhy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 848w, https://substackcdn.com/image/fetch/$s_!sHhy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 1272w, https://substackcdn.com/image/fetch/$s_!sHhy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sHhy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png" width="1456" height="459" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:459,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:144608,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sHhy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 424w, https://substackcdn.com/image/fetch/$s_!sHhy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 848w, https://substackcdn.com/image/fetch/$s_!sHhy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 1272w, https://substackcdn.com/image/fetch/$s_!sHhy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F655c98ba-7f71-4957-b15b-22f820e954a9_1770x558.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>which, by using a trick for fast lowercase transformation, can be reduced to</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FiQB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FiQB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 424w, https://substackcdn.com/image/fetch/$s_!FiQB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 848w, https://substackcdn.com/image/fetch/$s_!FiQB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 1272w, https://substackcdn.com/image/fetch/$s_!FiQB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FiQB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png" width="1456" height="520" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:520,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:140332,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FiQB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 424w, https://substackcdn.com/image/fetch/$s_!FiQB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 848w, https://substackcdn.com/image/fetch/$s_!FiQB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 1272w, https://substackcdn.com/image/fetch/$s_!FiQB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4e83f6a2-05eb-4d1a-a27e-18de57eb45b3_1562x558.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Clang generates the same assembly for both versions</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!uvPB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uvPB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 424w, https://substackcdn.com/image/fetch/$s_!uvPB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 848w, https://substackcdn.com/image/fetch/$s_!uvPB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 1272w, https://substackcdn.com/image/fetch/$s_!uvPB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uvPB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png" width="1456" height="839" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:839,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:180628,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uvPB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 424w, https://substackcdn.com/image/fetch/$s_!uvPB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 848w, https://substackcdn.com/image/fetch/$s_!uvPB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 1272w, https://substackcdn.com/image/fetch/$s_!uvPB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e6adb91-9743-49fa-b644-4f858c6f1f43_1486x856.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It may seem like there is nothing else to be done here. But we are dealing with just 2 single byte characters here, so why do we have to process them separately? What if we convert first 2 chars into a 16bit integer so that they could be processed as a single unit? And that&#8217;s exactly what <a href="https://github.com/ada-url/ada">ada</a> library for URL parsing does</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/ada-url/ada/blob/main/include/ada/checkers-inl.h#L15-L34" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bh9E!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 424w, https://substackcdn.com/image/fetch/$s_!Bh9E!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 848w, https://substackcdn.com/image/fetch/$s_!Bh9E!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!Bh9E!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bh9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png" width="1456" height="1038" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1038,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:301948,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/ada-url/ada/blob/main/include/ada/checkers-inl.h#L15-L34&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Bh9E!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 424w, https://substackcdn.com/image/fetch/$s_!Bh9E!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 848w, https://substackcdn.com/image/fetch/$s_!Bh9E!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 1272w, https://substackcdn.com/image/fetch/$s_!Bh9E!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F50416339-6a71-4ebe-af51-8799340ec067_1566x1116.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Since it&#8217;s a generic library,  it has to take into account endianness so that the second character is converted to lowercase using `| 0x20` trick we&#8217;ve used above. Also, it&#8217;s a UB to reinterpret_cast string bytes into uint16_t, so std::memcpy is has to be used until C++20&#8217;s std::bit_cast can be used.</p><p>Surely this implementation would result in a lot of assembly, right?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://compiler-explorer.com/z/nPWd863fz" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vXn0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 424w, https://substackcdn.com/image/fetch/$s_!vXn0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 848w, https://substackcdn.com/image/fetch/$s_!vXn0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 1272w, https://substackcdn.com/image/fetch/$s_!vXn0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vXn0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:168146,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://compiler-explorer.com/z/nPWd863fz&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vXn0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 424w, https://substackcdn.com/image/fetch/$s_!vXn0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 848w, https://substackcdn.com/image/fetch/$s_!vXn0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 1272w, https://substackcdn.com/image/fetch/$s_!vXn0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe803d565-7f49-4a79-97e9-95cce0cbb97a_1566x782.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Turns out that optimizing compilers like clang easily get rid of <code>memcpy</code>s and in the end everything boils down to <code>and</code>, <code>cmp</code> and <code>sete</code>.</p><p>In this article we had to process just 2 chars, but even without going all the way to something like AVX512, we can easily process 8 chars using uint64_t available on most platforms.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Faster matching name search in rustc.]]></title><description><![CDATA[Or using cheaper ways to maintain relations.]]></description><link>https://softwarebits.substack.com/p/faster-matching-name-search-in-rustc</link><guid isPermaLink="false">https://softwarebits.substack.com/p/faster-matching-name-search-in-rustc</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 23 Sep 2023 23:05:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A mathematical relation is a relationship between two sets of numbers or elements. Relations are often expressed using ordered pairs (x, y). A function is a special type of relation where each x value is related to only one y value.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G-XU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G-XU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 424w, https://substackcdn.com/image/fetch/$s_!G-XU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 848w, https://substackcdn.com/image/fetch/$s_!G-XU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 1272w, https://substackcdn.com/image/fetch/$s_!G-XU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G-XU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png" width="750" height="350" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:350,&quot;width&quot;:750,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Relations and Functions - Definition, Types, and Examples&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Relations and Functions - Definition, Types, and Examples" title="Relations and Functions - Definition, Types, and Examples" srcset="https://substackcdn.com/image/fetch/$s_!G-XU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 424w, https://substackcdn.com/image/fetch/$s_!G-XU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 848w, https://substackcdn.com/image/fetch/$s_!G-XU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 1272w, https://substackcdn.com/image/fetch/$s_!G-XU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5f839c6d-f627-4240-b7d8-a2f67b7a4a88_750x350.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>So when we write functions, we establish relationship between its parameters and its return values. In mathematics xs and ys are just symbols and functions do not have cost. In software it&#8217;s a different story - values take memory and function execution uses CPU cycles, so performance work is a search for cheaper way to establish relations.</p><p>That&#8217;s why we can use squares of distances between points instead of distances to avoid computing square roots. But today we&#8217;re going to use a different example. Rust is known for its developer friendly error messages, so we are going to look at</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9JCW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9JCW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 424w, https://substackcdn.com/image/fetch/$s_!9JCW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 848w, https://substackcdn.com/image/fetch/$s_!9JCW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!9JCW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9JCW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png" width="1456" height="866" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:866,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:253272,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9JCW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 424w, https://substackcdn.com/image/fetch/$s_!9JCW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 848w, https://substackcdn.com/image/fetch/$s_!9JCW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!9JCW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fce1b1bb5-7fea-4010-8a6c-f1d395f2b411_1752x1042.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>used for finding best suggestion candidates.</p><p>Note, that sort_by_words returns an owned String that is a formed by joining sorted parts of the original name split by underscore. Thanks to Rust&#8217;s lifetimes split returns slices of the name without new allocations, but, unfortunately, .join(&#8220;_&#8221;) cannot return a slice into name and as such has to create a new string.</p><p>But wait a second - do we actually need this joined string? Think about what kind of relation sort_by_words(name1) == sort_by_words(name2) establishes between name1 and name2. Is it any different than if we were to return split_words vector intead of joined string? It&#8217;s fairly obvious that for all strings name1 and name2, if vec![n11,n12,..] == vec![n21,n22,&#8230;] then &#8220;${n11}_${n12}_&#8230;}&#8221; == &#8220;${n21}_${n22}_&#8230;}&#8221; and the other way around. This means that we can rewrite sort_by_words as follows</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/rust-lang/rust/pull/114351" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Im-C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 424w, https://substackcdn.com/image/fetch/$s_!Im-C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 848w, https://substackcdn.com/image/fetch/$s_!Im-C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 1272w, https://substackcdn.com/image/fetch/$s_!Im-C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Im-C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png" width="1456" height="495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:495,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146847,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/rust-lang/rust/pull/114351&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Im-C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 424w, https://substackcdn.com/image/fetch/$s_!Im-C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 848w, https://substackcdn.com/image/fetch/$s_!Im-C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 1272w, https://substackcdn.com/image/fetch/$s_!Im-C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F286ecec3-6077-4df6-9afc-1f077bd081df_1752x596.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and get the same result without unnecessary string allocations.</p><p>It&#8217;s time to see how much difference does it make using</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123912037\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-sort_by_words_benchmark-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;sort_by_words_benchmark.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> criterion<span class=pl-kos>::</span><span class=pl-kos>{</span>criterion_group<span class=pl-kos>,</span> criterion_main<span class=pl-kos>,</span> <span class=pl-v>Criterion</span><span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>sort_by_words1</span><span class=pl-kos>(</span><span class=pl-s1>name</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-smi>str</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>String</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> split_words<span class=pl-kos>:</span> <span class=pl-smi>Vec</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>str</span><span class=pl-kos>&amp;gt;</span> = name<span class=pl-kos>.</span><span class=pl-en>split</span><span class=pl-kos>(</span><span class=pl-s>&amp;#39;_&amp;#39;</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>collect</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// We are sorting primitive &amp;amp;strs and can use unstable sort here.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    split_words<span class=pl-kos>.</span><span class=pl-en>sort_unstable</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    split_words<span class=pl-kos>.</span><span class=pl-en>join</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;_&amp;quot;</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>sort_by_words2</span><span class=pl-kos>(</span><span class=pl-s1>name</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-smi>str</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>Vec</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>str</span><span class=pl-kos>&amp;gt;</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> split_words<span class=pl-kos>:</span> <span class=pl-smi>Vec</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>str</span><span class=pl-kos>&amp;gt;</span> = name<span class=pl-kos>.</span><span class=pl-en>split</span><span class=pl-kos>(</span><span class=pl-s>&amp;#39;_&amp;#39;</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>collect</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// We are sorting primitive &amp;amp;strs and can use unstable sort here.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    split_words<span class=pl-kos>.</span><span class=pl-en>sort_unstable</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    split_words</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>bench_sorts</span><span class=pl-kos>(</span><span class=pl-s1>c</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>Criterion</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> group = c<span class=pl-kos>.</span><span class=pl-en>benchmark_group</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;multiply add&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> name = <span class=pl-s>&amp;quot;some_fancy_name&amp;quot;</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;original&amp;quot;</span><span class=pl-kos>,</span> |b| b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-en>sort_by_words1</span><span class=pl-kos>(</span>name<span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;proposed&amp;quot;</span><span class=pl-kos>,</span> |b| b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-en>sort_by_words2</span><span class=pl-kos>(</span>name<span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>finish</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_group</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches, bench_sorts<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-sort_by_words_benchmark-rs-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_main</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/ac4ebba70949008f607dc0ae5cb7102f/raw/5068b1a6d41c19e861160869a3964a6bebbb088f/sort_by_words_benchmark.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/ac4ebba70949008f607dc0ae5cb7102f#file-sort_by_words_benchmark-rs\&quot;>\n          sort_by_words_benchmark.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123912037" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-sort_by_words_benchmark-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="sort_by_words_benchmark.rs">
        <tbody><tr>
          <td id="file-sort_by_words_benchmark-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-sort_by_words_benchmark-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> criterion<span class="pl-kos">::</span><span class="pl-kos">{</span>criterion_group<span class="pl-kos">,</span> criterion_main<span class="pl-kos">,</span> <span class="pl-v">Criterion</span><span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-sort_by_words_benchmark-rs-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-sort_by_words_benchmark-rs-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">sort_by_words1</span><span class="pl-kos">(</span><span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">String</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-sort_by_words_benchmark-rs-LC4" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> split_words<span class="pl-kos">:</span> <span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">&gt;</span> = name<span class="pl-kos">.</span><span class="pl-en">split</span><span class="pl-kos">(</span><span class="pl-s">'_'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">collect</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-sort_by_words_benchmark-rs-LC5" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// We are sorting primitive &amp;strs and can use unstable sort here.</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-sort_by_words_benchmark-rs-LC6" class="blob-code blob-code-inner js-file-line">    split_words<span class="pl-kos">.</span><span class="pl-en">sort_unstable</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-sort_by_words_benchmark-rs-LC7" class="blob-code blob-code-inner js-file-line">    split_words<span class="pl-kos">.</span><span class="pl-en">join</span><span class="pl-kos">(</span><span class="pl-s">"_"</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-sort_by_words_benchmark-rs-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-sort_by_words_benchmark-rs-LC9" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-sort_by_words_benchmark-rs-LC10" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">sort_by_words2</span><span class="pl-kos">(</span><span class="pl-s1">name</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">&gt;</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-sort_by_words_benchmark-rs-LC11" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> split_words<span class="pl-kos">:</span> <span class="pl-smi">Vec</span><span class="pl-kos">&lt;</span><span class="pl-c1">&amp;</span><span class="pl-smi">str</span><span class="pl-kos">&gt;</span> = name<span class="pl-kos">.</span><span class="pl-en">split</span><span class="pl-kos">(</span><span class="pl-s">'_'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">collect</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-sort_by_words_benchmark-rs-LC12" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// We are sorting primitive &amp;strs and can use unstable sort here.</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-sort_by_words_benchmark-rs-LC13" class="blob-code blob-code-inner js-file-line">    split_words<span class="pl-kos">.</span><span class="pl-en">sort_unstable</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-sort_by_words_benchmark-rs-LC14" class="blob-code blob-code-inner js-file-line">    split_words</td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-sort_by_words_benchmark-rs-LC15" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-sort_by_words_benchmark-rs-LC16" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-sort_by_words_benchmark-rs-LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">bench_sorts</span><span class="pl-kos">(</span><span class="pl-s1">c</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Criterion</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-sort_by_words_benchmark-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> group = c<span class="pl-kos">.</span><span class="pl-en">benchmark_group</span><span class="pl-kos">(</span><span class="pl-s">"multiply add"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-sort_by_words_benchmark-rs-LC19" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> name = <span class="pl-s">"some_fancy_name"</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-sort_by_words_benchmark-rs-LC20" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"original"</span><span class="pl-kos">,</span> |b| b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-en">sort_by_words1</span><span class="pl-kos">(</span>name<span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-sort_by_words_benchmark-rs-LC21" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"proposed"</span><span class="pl-kos">,</span> |b| b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-en">sort_by_words2</span><span class="pl-kos">(</span>name<span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-sort_by_words_benchmark-rs-LC22" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">finish</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-sort_by_words_benchmark-rs-LC23" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-sort_by_words_benchmark-rs-LC24" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-sort_by_words_benchmark-rs-LC25" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_group</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches, bench_sorts<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-sort_by_words_benchmark-rs-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-sort_by_words_benchmark-rs-LC26" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_main</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/ac4ebba70949008f607dc0ae5cb7102f/raw/5068b1a6d41c19e861160869a3964a6bebbb088f/sort_by_words_benchmark.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/ac4ebba70949008f607dc0ae5cb7102f#file-sort_by_words_benchmark-rs">
          sort_by_words_benchmark.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>and the results on M1 MacBook Air are</p><pre><code>     Running benches/sort_by_words_benchmark.rs (target/release/deps/sort_by_words_benchmark-5adee33fa37ce7e2)
Benchmarking multiply add/original: Collecting 100 samples in estimated 5.0006 s (27M iteratio
multiply add/original   time:   [172.85 ns 177.30 ns 182.83 ns]
Found 3 outliers among 100 measurements (3.00%)
  2 (2.00%) high mild
  1 (1.00%) high severe
Benchmarking multiply add/proposed: Collecting 100 samples in estimated 5.0000 s (61M iteratio
multiply add/proposed   time:   [81.106 ns 81.605 ns 82.261 ns]
Found 12 outliers among 100 measurements (12.00%)
  5 (5.00%) high mild
  7 (7.00%) high severe</code></pre><p>In summary we&#8217;re getting a 2X+ faster code without any downsides. That&#8217;s the power of relation modeling in action. <a href="https://github.com/rust-lang/rust/pull/114351">PR</a> has already landed in Rust and may already be processing your compiler errors.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Adding unsafe code to rustc.]]></title><description><![CDATA[Or why it's good to understand algorithm invariants.]]></description><link>https://softwarebits.substack.com/p/adding-unsafe-code-to-rustc</link><guid isPermaLink="false">https://softwarebits.substack.com/p/adding-unsafe-code-to-rustc</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 16 Sep 2023 23:02:43 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vzSE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In previous article we&#8217;ve managed to speed up number encoding in rustc by getting rid of reverse invocation and ended up with</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vzSE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vzSE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 424w, https://substackcdn.com/image/fetch/$s_!vzSE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 848w, https://substackcdn.com/image/fetch/$s_!vzSE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!vzSE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vzSE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png" width="1456" height="1320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1320,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:304428,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vzSE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 424w, https://substackcdn.com/image/fetch/$s_!vzSE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 848w, https://substackcdn.com/image/fetch/$s_!vzSE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!vzSE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2161df19-4c52-47cd-9e91-7508fd523271_1520x1378.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Attentive readers must have noticed the .unwrap() call on the result of from_utf8. It&#8217;s required because from_utf8 returns <code>Err</code> if the slice is not UTF-8 with a description as to why the provided slice is not UTF-8. It&#8217;s pretty obvious that in order to decide if error should be returned, from_utf8 has to validate provided slice, which is not free.</p><p>Fair enough, but is it possible for the slice to ever contain non UTF-8 characters? All characters come from BASE_64 array and all of its characters are valid UTF-8 characters. In such case, why not skip the validation?</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://github.com/rust-lang/rust/pull/114339/files" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BdJj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 424w, https://substackcdn.com/image/fetch/$s_!BdJj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 848w, https://substackcdn.com/image/fetch/$s_!BdJj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 1272w, https://substackcdn.com/image/fetch/$s_!BdJj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BdJj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png" width="1446" height="288" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:288,&quot;width&quot;:1446,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69942,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/rust-lang/rust/pull/114339/files&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!BdJj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 424w, https://substackcdn.com/image/fetch/$s_!BdJj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 848w, https://substackcdn.com/image/fetch/$s_!BdJj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 1272w, https://substackcdn.com/image/fetch/$s_!BdJj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb9e6c906-df4a-489a-9f61-71c005fa8a97_1446x288.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Of course, we leave a safety comment explaining why this unsafe block is actually safe and use the following benchmark to see if it makes any difference</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123808669\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-base_n_benchmark-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;base_n_benchmark.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> criterion<span class=pl-kos>::</span><span class=pl-kos>{</span>criterion_group<span class=pl-kos>,</span> criterion_main<span class=pl-kos>,</span> <span class=pl-v>Criterion</span><span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> std<span class=pl-kos>::</span>str<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>const</span> <span class=pl-v>MAX_BASE</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span> = <span class=pl-c1>64</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>const</span> <span class=pl-v>ALPHANUMERIC_ONLY</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span> = <span class=pl-c1>62</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>const</span> <span class=pl-v>CASE_INSENSITIVE</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span> = <span class=pl-c1>36</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>const</span> <span class=pl-v>BASE_64</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-smi>u8</span><span class=pl-kos>;</span> <span class=pl-v>MAX_BASE</span><span class=pl-kos>]</span> =</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-s>b&amp;quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@$&amp;quot;</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c1>#<span class=pl-kos>[</span>inline<span class=pl-kos>]</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>push_str</span><span class=pl-kos>(</span><span class=pl-k>mut</span> <span class=pl-s1>n</span><span class=pl-kos>:</span> <span class=pl-smi>u128</span><span class=pl-kos>,</span> <span class=pl-s1>base</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span><span class=pl-kos>,</span> <span class=pl-s1>output</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>String</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-en>debug_assert</span><span class=pl-en>!</span><span class=pl-kos>(</span>base &amp;gt;= <span class=pl-c1>2</span> &amp;amp;&amp;amp; base &amp;lt;= <span class=pl-v>MAX_BASE</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-kos>[</span><span class=pl-c1>0u8</span><span class=pl-kos>;</span> <span class=pl-c1>128</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> index = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> base = base <span class=pl-k>as</span> <span class=pl-smi>u128</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        s<span class=pl-kos>[</span>index<span class=pl-kos>]</span> = <span class=pl-v>BASE_64</span><span class=pl-kos>[</span><span class=pl-kos>(</span>n % base<span class=pl-kos>)</span> <span class=pl-k>as</span> <span class=pl-smi>usize</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        index += <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        n /= base<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> n == <span class=pl-c1>0</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    s<span class=pl-kos>[</span><span class=pl-c1>0</span>..index<span class=pl-kos>]</span><span class=pl-kos>.</span><span class=pl-en>reverse</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    output<span class=pl-kos>.</span><span class=pl-en>push_str</span><span class=pl-kos>(</span>str<span class=pl-kos>::</span><span class=pl-en>from_utf8</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>s<span class=pl-kos>[</span><span class=pl-c1>0</span>..index<span class=pl-kos>]</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>unwrap</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c1>#<span class=pl-kos>[</span>inline<span class=pl-kos>]</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>push_str2</span><span class=pl-kos>(</span><span class=pl-k>mut</span> <span class=pl-s1>n</span><span class=pl-kos>:</span> <span class=pl-smi>u128</span><span class=pl-kos>,</span> <span class=pl-s1>base</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span><span class=pl-kos>,</span> <span class=pl-s1>output</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>String</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-en>debug_assert</span><span class=pl-en>!</span><span class=pl-kos>(</span>base &amp;gt;= <span class=pl-c1>2</span> &amp;amp;&amp;amp; base &amp;lt;= <span class=pl-v>MAX_BASE</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-kos>[</span><span class=pl-c1>0u8</span><span class=pl-kos>;</span> <span class=pl-c1>128</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> index = s<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> base = base <span class=pl-k>as</span> <span class=pl-smi>u128</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        index -= <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        s<span class=pl-kos>[</span>index<span class=pl-kos>]</span> = <span class=pl-v>BASE_64</span><span class=pl-kos>[</span><span class=pl-kos>(</span>n % base<span class=pl-kos>)</span> <span class=pl-k>as</span> <span class=pl-smi>usize</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        n /= base<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> n == <span class=pl-c1>0</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    output<span class=pl-kos>.</span><span class=pl-en>push_str</span><span class=pl-kos>(</span><span class=pl-k>unsafe</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-c>// SAFETY: `s` is populated using only valid utf8 characters from `BASE_64`</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        str<span class=pl-kos>::</span><span class=pl-en>from_utf8_unchecked</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>s<span class=pl-kos>[</span>index..<span class=pl-kos>]</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>bench_push_str</span><span class=pl-kos>(</span><span class=pl-s1>c</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>Criterion</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> group = c<span class=pl-kos>.</span><span class=pl-en>benchmark_group</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;push_str&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> xs = <span class=pl-kos>[</span><span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-c1>1</span><span class=pl-kos>,</span> <span class=pl-c1>35</span><span class=pl-kos>,</span> <span class=pl-c1>36</span><span class=pl-kos>,</span> <span class=pl-c1>37</span><span class=pl-kos>,</span> u64<span class=pl-kos>::</span><span class=pl-v>MAX</span> <span class=pl-k>as</span> <span class=pl-smi>u128</span><span class=pl-kos>,</span> u128<span class=pl-kos>::</span><span class=pl-v>MAX</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;old&amp;quot;</span><span class=pl-kos>,</span> |b| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> total = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-smi>String</span><span class=pl-kos>::</span><span class=pl-en>new</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>for</span> base <span class=pl-k>in</span> <span class=pl-c1>2</span>..<span class=pl-c1>37</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L66\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;66\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC66\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-k>for</span> n <span class=pl-k>in</span> xs <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L67\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;67\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC67\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    s<span class=pl-kos>.</span><span class=pl-en>clear</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L68\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;68\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC68\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    <span class=pl-en>push_str</span><span class=pl-kos>(</span>n<span class=pl-kos>,</span> base<span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> s<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L69\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;69\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC69\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    total += s<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L70\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;70\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC70\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L71\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;71\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC71\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L72\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;72\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC72\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            total</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L73\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;73\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC73\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L74\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;74\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC74\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L75\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;75\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC75\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;new&amp;quot;</span><span class=pl-kos>,</span> |b| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L76\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;76\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC76\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L77\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;77\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC77\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> total = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L78\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;78\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC78\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-smi>String</span><span class=pl-kos>::</span><span class=pl-en>new</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L79\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;79\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC79\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>for</span> base <span class=pl-k>in</span> <span class=pl-c1>2</span>..<span class=pl-c1>37</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L80\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;80\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC80\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-k>for</span> n <span class=pl-k>in</span> xs <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L81\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;81\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC81\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    s<span class=pl-kos>.</span><span class=pl-en>clear</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L82\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;82\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC82\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    <span class=pl-en>push_str2</span><span class=pl-kos>(</span>n<span class=pl-kos>,</span> base<span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> s<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L83\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;83\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC83\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    total += s<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L84\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;84\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC84\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L85\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;85\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC85\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L86\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;86\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC86\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            total</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L87\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;87\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC87\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L88\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;88\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC88\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L89\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;89\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC89\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>finish</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L90\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;90\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC90\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L91\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;91\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC91\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L92\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;92\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC92\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_group</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches, bench_push_str<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L93\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;93\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC93\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_main</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/e1e63c07927d8f31e71695a9c617bbf3/raw/33e4110f180a0712a807015cb1c075a8f05e727a/base_n_benchmark.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/e1e63c07927d8f31e71695a9c617bbf3#file-base_n_benchmark-rs\&quot;>\n          base_n_benchmark.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123808669" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-base_n_benchmark-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="base_n_benchmark.rs">
        <tbody><tr>
          <td id="file-base_n_benchmark-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-base_n_benchmark-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> criterion<span class="pl-kos">::</span><span class="pl-kos">{</span>criterion_group<span class="pl-kos">,</span> criterion_main<span class="pl-kos">,</span> <span class="pl-v">Criterion</span><span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-base_n_benchmark-rs-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-base_n_benchmark-rs-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> std<span class="pl-kos">::</span>str<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-base_n_benchmark-rs-LC4" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-base_n_benchmark-rs-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-v">MAX_BASE</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span> = <span class="pl-c1">64</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-base_n_benchmark-rs-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-v">ALPHANUMERIC_ONLY</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span> = <span class="pl-c1">62</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-base_n_benchmark-rs-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-v">CASE_INSENSITIVE</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span> = <span class="pl-c1">36</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-base_n_benchmark-rs-LC8" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-base_n_benchmark-rs-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-v">BASE_64</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-smi">u8</span><span class="pl-kos">;</span> <span class="pl-v">MAX_BASE</span><span class="pl-kos">]</span> =</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-base_n_benchmark-rs-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-s">b"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@$"</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-base_n_benchmark-rs-LC11" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-base_n_benchmark-rs-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">#<span class="pl-kos">[</span>inline<span class="pl-kos">]</span></span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-base_n_benchmark-rs-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">push_str</span><span class="pl-kos">(</span><span class="pl-k">mut</span> <span class="pl-s1">n</span><span class="pl-kos">:</span> <span class="pl-smi">u128</span><span class="pl-kos">,</span> <span class="pl-s1">base</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span><span class="pl-kos">,</span> <span class="pl-s1">output</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-base_n_benchmark-rs-LC14" class="blob-code blob-code-inner js-file-line">    <span class="pl-en">debug_assert</span><span class="pl-en">!</span><span class="pl-kos">(</span>base &gt;= <span class="pl-c1">2</span> &amp;&amp; base &lt;= <span class="pl-v">MAX_BASE</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-base_n_benchmark-rs-LC15" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-kos">[</span><span class="pl-c1">0u8</span><span class="pl-kos">;</span> <span class="pl-c1">128</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-base_n_benchmark-rs-LC16" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> index = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-base_n_benchmark-rs-LC17" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-base_n_benchmark-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> base = base <span class="pl-k">as</span> <span class="pl-smi">u128</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-base_n_benchmark-rs-LC19" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-base_n_benchmark-rs-LC20" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-base_n_benchmark-rs-LC21" class="blob-code blob-code-inner js-file-line">        s<span class="pl-kos">[</span>index<span class="pl-kos">]</span> = <span class="pl-v">BASE_64</span><span class="pl-kos">[</span><span class="pl-kos">(</span>n % base<span class="pl-kos">)</span> <span class="pl-k">as</span> <span class="pl-smi">usize</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-base_n_benchmark-rs-LC22" class="blob-code blob-code-inner js-file-line">        index += <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-base_n_benchmark-rs-LC23" class="blob-code blob-code-inner js-file-line">        n /= base<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-base_n_benchmark-rs-LC24" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-base_n_benchmark-rs-LC25" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> n == <span class="pl-c1">0</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-base_n_benchmark-rs-LC26" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-base_n_benchmark-rs-LC27" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-base_n_benchmark-rs-LC28" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-base_n_benchmark-rs-LC29" class="blob-code blob-code-inner js-file-line">    s<span class="pl-kos">[</span><span class="pl-c1">0</span>..index<span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-en">reverse</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-base_n_benchmark-rs-LC30" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-base_n_benchmark-rs-LC31" class="blob-code blob-code-inner js-file-line">    output<span class="pl-kos">.</span><span class="pl-en">push_str</span><span class="pl-kos">(</span>str<span class="pl-kos">::</span><span class="pl-en">from_utf8</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>s<span class="pl-kos">[</span><span class="pl-c1">0</span>..index<span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">unwrap</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-base_n_benchmark-rs-LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-base_n_benchmark-rs-LC33" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-base_n_benchmark-rs-LC34" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">#<span class="pl-kos">[</span>inline<span class="pl-kos">]</span></span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-base_n_benchmark-rs-LC35" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">push_str2</span><span class="pl-kos">(</span><span class="pl-k">mut</span> <span class="pl-s1">n</span><span class="pl-kos">:</span> <span class="pl-smi">u128</span><span class="pl-kos">,</span> <span class="pl-s1">base</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span><span class="pl-kos">,</span> <span class="pl-s1">output</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-base_n_benchmark-rs-LC36" class="blob-code blob-code-inner js-file-line">    <span class="pl-en">debug_assert</span><span class="pl-en">!</span><span class="pl-kos">(</span>base &gt;= <span class="pl-c1">2</span> &amp;&amp; base &lt;= <span class="pl-v">MAX_BASE</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-base_n_benchmark-rs-LC37" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-kos">[</span><span class="pl-c1">0u8</span><span class="pl-kos">;</span> <span class="pl-c1">128</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-base_n_benchmark-rs-LC38" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> index = s<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-base_n_benchmark-rs-LC39" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-base_n_benchmark-rs-LC40" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> base = base <span class="pl-k">as</span> <span class="pl-smi">u128</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-base_n_benchmark-rs-LC41" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-base_n_benchmark-rs-LC42" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-base_n_benchmark-rs-LC43" class="blob-code blob-code-inner js-file-line">        index -= <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-base_n_benchmark-rs-LC44" class="blob-code blob-code-inner js-file-line">        s<span class="pl-kos">[</span>index<span class="pl-kos">]</span> = <span class="pl-v">BASE_64</span><span class="pl-kos">[</span><span class="pl-kos">(</span>n % base<span class="pl-kos">)</span> <span class="pl-k">as</span> <span class="pl-smi">usize</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-base_n_benchmark-rs-LC45" class="blob-code blob-code-inner js-file-line">        n /= base<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-base_n_benchmark-rs-LC46" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-base_n_benchmark-rs-LC47" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> n == <span class="pl-c1">0</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-base_n_benchmark-rs-LC48" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-base_n_benchmark-rs-LC49" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-base_n_benchmark-rs-LC50" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-base_n_benchmark-rs-LC51" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-base_n_benchmark-rs-LC52" class="blob-code blob-code-inner js-file-line">    output<span class="pl-kos">.</span><span class="pl-en">push_str</span><span class="pl-kos">(</span><span class="pl-k">unsafe</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-base_n_benchmark-rs-LC53" class="blob-code blob-code-inner js-file-line">        <span class="pl-c">// SAFETY: `s` is populated using only valid utf8 characters from `BASE_64`</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-base_n_benchmark-rs-LC54" class="blob-code blob-code-inner js-file-line">        str<span class="pl-kos">::</span><span class="pl-en">from_utf8_unchecked</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>s<span class="pl-kos">[</span>index..<span class="pl-kos">]</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-base_n_benchmark-rs-LC55" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-base_n_benchmark-rs-LC56" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-base_n_benchmark-rs-LC57" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-base_n_benchmark-rs-LC58" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">bench_push_str</span><span class="pl-kos">(</span><span class="pl-s1">c</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Criterion</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-base_n_benchmark-rs-LC59" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> group = c<span class="pl-kos">.</span><span class="pl-en">benchmark_group</span><span class="pl-kos">(</span><span class="pl-s">"push_str"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-base_n_benchmark-rs-LC60" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> xs = <span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">35</span><span class="pl-kos">,</span> <span class="pl-c1">36</span><span class="pl-kos">,</span> <span class="pl-c1">37</span><span class="pl-kos">,</span> u64<span class="pl-kos">::</span><span class="pl-v">MAX</span> <span class="pl-k">as</span> <span class="pl-smi">u128</span><span class="pl-kos">,</span> u128<span class="pl-kos">::</span><span class="pl-v">MAX</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-base_n_benchmark-rs-LC61" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"old"</span><span class="pl-kos">,</span> |b| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-base_n_benchmark-rs-LC62" class="blob-code blob-code-inner js-file-line">        b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-base_n_benchmark-rs-LC63" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> total = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-base_n_benchmark-rs-LC64" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-smi">String</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-base_n_benchmark-rs-LC65" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">for</span> base <span class="pl-k">in</span> <span class="pl-c1">2</span>..<span class="pl-c1">37</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L66" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="66"></td>
          <td id="file-base_n_benchmark-rs-LC66" class="blob-code blob-code-inner js-file-line">                <span class="pl-k">for</span> n <span class="pl-k">in</span> xs <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L67" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="67"></td>
          <td id="file-base_n_benchmark-rs-LC67" class="blob-code blob-code-inner js-file-line">                    s<span class="pl-kos">.</span><span class="pl-en">clear</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L68" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="68"></td>
          <td id="file-base_n_benchmark-rs-LC68" class="blob-code blob-code-inner js-file-line">                    <span class="pl-en">push_str</span><span class="pl-kos">(</span>n<span class="pl-kos">,</span> base<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> s<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L69" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="69"></td>
          <td id="file-base_n_benchmark-rs-LC69" class="blob-code blob-code-inner js-file-line">                    total += s<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L70" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="70"></td>
          <td id="file-base_n_benchmark-rs-LC70" class="blob-code blob-code-inner js-file-line">                <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L71" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="71"></td>
          <td id="file-base_n_benchmark-rs-LC71" class="blob-code blob-code-inner js-file-line">            <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L72" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="72"></td>
          <td id="file-base_n_benchmark-rs-LC72" class="blob-code blob-code-inner js-file-line">            total</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L73" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="73"></td>
          <td id="file-base_n_benchmark-rs-LC73" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L74" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="74"></td>
          <td id="file-base_n_benchmark-rs-LC74" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L75" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="75"></td>
          <td id="file-base_n_benchmark-rs-LC75" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"new"</span><span class="pl-kos">,</span> |b| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L76" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="76"></td>
          <td id="file-base_n_benchmark-rs-LC76" class="blob-code blob-code-inner js-file-line">        b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L77" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="77"></td>
          <td id="file-base_n_benchmark-rs-LC77" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> total = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L78" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="78"></td>
          <td id="file-base_n_benchmark-rs-LC78" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-smi">String</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L79" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="79"></td>
          <td id="file-base_n_benchmark-rs-LC79" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">for</span> base <span class="pl-k">in</span> <span class="pl-c1">2</span>..<span class="pl-c1">37</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L80" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="80"></td>
          <td id="file-base_n_benchmark-rs-LC80" class="blob-code blob-code-inner js-file-line">                <span class="pl-k">for</span> n <span class="pl-k">in</span> xs <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L81" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="81"></td>
          <td id="file-base_n_benchmark-rs-LC81" class="blob-code blob-code-inner js-file-line">                    s<span class="pl-kos">.</span><span class="pl-en">clear</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L82" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="82"></td>
          <td id="file-base_n_benchmark-rs-LC82" class="blob-code blob-code-inner js-file-line">                    <span class="pl-en">push_str2</span><span class="pl-kos">(</span>n<span class="pl-kos">,</span> base<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> s<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L83" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="83"></td>
          <td id="file-base_n_benchmark-rs-LC83" class="blob-code blob-code-inner js-file-line">                    total += s<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L84" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="84"></td>
          <td id="file-base_n_benchmark-rs-LC84" class="blob-code blob-code-inner js-file-line">                <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L85" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="85"></td>
          <td id="file-base_n_benchmark-rs-LC85" class="blob-code blob-code-inner js-file-line">            <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L86" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="86"></td>
          <td id="file-base_n_benchmark-rs-LC86" class="blob-code blob-code-inner js-file-line">            total</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L87" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="87"></td>
          <td id="file-base_n_benchmark-rs-LC87" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L88" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="88"></td>
          <td id="file-base_n_benchmark-rs-LC88" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L89" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="89"></td>
          <td id="file-base_n_benchmark-rs-LC89" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">finish</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L90" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="90"></td>
          <td id="file-base_n_benchmark-rs-LC90" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L91" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="91"></td>
          <td id="file-base_n_benchmark-rs-LC91" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L92" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="92"></td>
          <td id="file-base_n_benchmark-rs-LC92" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_group</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches, bench_push_str<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L93" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="93"></td>
          <td id="file-base_n_benchmark-rs-LC93" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_main</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/e1e63c07927d8f31e71695a9c617bbf3/raw/33e4110f180a0712a807015cb1c075a8f05e727a/base_n_benchmark.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/e1e63c07927d8f31e71695a9c617bbf3#file-base_n_benchmark-rs">
          base_n_benchmark.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>The results on M1 macbook air:</p><pre><code>Running benches/base_n_benchmark.rs (target/release/deps/base_n_benchmark-825fe5895b5c2693)
push_str/old            time:   [14.670 &#181;s 14.852 &#181;s 15.074 &#181;s]
Found 11 outliers among 100 measurements (11.00%)
  4 (4.00%) high mild
  7 (7.00%) high severe
push_str/new            time:   [12.573 &#181;s 12.674 &#181;s 12.801 &#181;s]
Found 11 outliers among 100 measurements (11.00%)
  7 (7.00%) high mild
  4 (4.00%) high severe</code></pre><p>Not bad for a single liner? Compilers have a difficult job of optimizing code without affecting correctness. Sometimes we have knowledge that is outside of compiler&#8217;s jurisdiction and can help it by taking responsibility on maintaining some of the invariants on our own. When making a decision to do this, don&#8217;t forget to consider the cost of maintenance - when assumptions or code change, someone has to go through manually maintained invariants to make sure they are still up-to-date. In this particular case, the change is fairly localized and shouldn&#8217;t be hard to maintain, but you can see that reviewers <a href="https://github.com/rust-lang/rust/pull/114339">are not rushing to accept it</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Avoiding unnecessary movements.]]></title><description><![CDATA[Or fewer reverse calls in rustc.]]></description><link>https://softwarebits.substack.com/p/avoiding-unnecessary-movements</link><guid isPermaLink="false">https://softwarebits.substack.com/p/avoiding-unnecessary-movements</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 09 Sep 2023 23:40:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GyPC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Rustc is the official compiler for the Rust programming language. It takes Rust source code as input and produces binary code, either as a library or executable. Rustc is written in Rust itself, and is designed to be fast, efficient, and safe. Having so many responsibilities, it&#8217;s no surprise that it has a number of reusable data structures and algorithms under the hood. Today we&#8217;re going to take a look at one of them - integer encoding for requested base.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GyPC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GyPC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 424w, https://substackcdn.com/image/fetch/$s_!GyPC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 848w, https://substackcdn.com/image/fetch/$s_!GyPC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!GyPC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GyPC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png" width="1456" height="1320" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1320,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:310337,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GyPC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 424w, https://substackcdn.com/image/fetch/$s_!GyPC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 848w, https://substackcdn.com/image/fetch/$s_!GyPC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 1272w, https://substackcdn.com/image/fetch/$s_!GyPC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4700f0fb-3d8a-411e-aa78-2d19cc91d7bb_1520x1378.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The implementation is clean and easy to understand. At the same time, every time I see reverse call, I start to wonder if it&#8217;s really necessary.  Let&#8217;s see, on each iteration we chop off the last digit of the resulting number and we place it at the `index`th position from left to right. But we already know the size of the buffer, so why don&#8217;t we just place this digit into its final position right away?</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/rust-lang/rust/pull/114306/files?diff=unified&amp;w=0" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VPUD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 424w, https://substackcdn.com/image/fetch/$s_!VPUD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 848w, https://substackcdn.com/image/fetch/$s_!VPUD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!VPUD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VPUD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png" width="1182" height="1074" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1074,&quot;width&quot;:1182,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:192744,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/rust-lang/rust/pull/114306/files?diff=unified&amp;w=0&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VPUD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 424w, https://substackcdn.com/image/fetch/$s_!VPUD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 848w, https://substackcdn.com/image/fetch/$s_!VPUD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 1272w, https://substackcdn.com/image/fetch/$s_!VPUD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8ea573f5-9847-4937-8742-78015d0c612e_1182x1074.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This way we no longer need the reverse call. We shouldn&#8217;t expect huge wins here, since the length of the resulting string is usually fairly small to matter much, but according to</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123789385\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-base_n_benchmark-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;base_n_benchmark.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> criterion<span class=pl-kos>::</span><span class=pl-kos>{</span>criterion_group<span class=pl-kos>,</span> criterion_main<span class=pl-kos>,</span> <span class=pl-v>Criterion</span><span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> std<span class=pl-kos>::</span>str<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>const</span> <span class=pl-v>MAX_BASE</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span> = <span class=pl-c1>64</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>const</span> <span class=pl-v>ALPHANUMERIC_ONLY</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span> = <span class=pl-c1>62</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>const</span> <span class=pl-v>CASE_INSENSITIVE</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span> = <span class=pl-c1>36</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>const</span> <span class=pl-v>BASE_64</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-smi>u8</span><span class=pl-kos>;</span> <span class=pl-v>MAX_BASE</span><span class=pl-kos>]</span> =</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-s>b&amp;quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@$&amp;quot;</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c1>#<span class=pl-kos>[</span>inline<span class=pl-kos>]</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>push_str</span><span class=pl-kos>(</span><span class=pl-k>mut</span> <span class=pl-s1>n</span><span class=pl-kos>:</span> <span class=pl-smi>u128</span><span class=pl-kos>,</span> <span class=pl-s1>base</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span><span class=pl-kos>,</span> <span class=pl-s1>output</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>String</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-en>debug_assert</span><span class=pl-en>!</span><span class=pl-kos>(</span>base &amp;gt;= <span class=pl-c1>2</span> &amp;amp;&amp;amp; base &amp;lt;= <span class=pl-v>MAX_BASE</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-kos>[</span><span class=pl-c1>0u8</span><span class=pl-kos>;</span> <span class=pl-c1>128</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> index = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> base = base <span class=pl-k>as</span> <span class=pl-smi>u128</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        s<span class=pl-kos>[</span>index<span class=pl-kos>]</span> = <span class=pl-v>BASE_64</span><span class=pl-kos>[</span><span class=pl-kos>(</span>n % base<span class=pl-kos>)</span> <span class=pl-k>as</span> <span class=pl-smi>usize</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        index += <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        n /= base<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> n == <span class=pl-c1>0</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    s<span class=pl-kos>[</span><span class=pl-c1>0</span>..index<span class=pl-kos>]</span><span class=pl-kos>.</span><span class=pl-en>reverse</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    output<span class=pl-kos>.</span><span class=pl-en>push_str</span><span class=pl-kos>(</span>str<span class=pl-kos>::</span><span class=pl-en>from_utf8</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>s<span class=pl-kos>[</span><span class=pl-c1>0</span>..index<span class=pl-kos>]</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>unwrap</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c1>#<span class=pl-kos>[</span>inline<span class=pl-kos>]</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>push_str2</span><span class=pl-kos>(</span><span class=pl-k>mut</span> <span class=pl-s1>n</span><span class=pl-kos>:</span> <span class=pl-smi>u128</span><span class=pl-kos>,</span> <span class=pl-s1>base</span><span class=pl-kos>:</span> <span class=pl-smi>usize</span><span class=pl-kos>,</span> <span class=pl-s1>output</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>String</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-en>debug_assert</span><span class=pl-en>!</span><span class=pl-kos>(</span>base &amp;gt;= <span class=pl-c1>2</span> &amp;amp;&amp;amp; base &amp;lt;= <span class=pl-v>MAX_BASE</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-kos>[</span><span class=pl-c1>0u8</span><span class=pl-kos>;</span> <span class=pl-c1>128</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> index = s<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> base = base <span class=pl-k>as</span> <span class=pl-smi>u128</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        index -= <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        s<span class=pl-kos>[</span>index<span class=pl-kos>]</span> = <span class=pl-v>BASE_64</span><span class=pl-kos>[</span><span class=pl-kos>(</span>n % base<span class=pl-kos>)</span> <span class=pl-k>as</span> <span class=pl-smi>usize</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        n /= base<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> n == <span class=pl-c1>0</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    output<span class=pl-kos>.</span><span class=pl-en>push_str</span><span class=pl-kos>(</span>str<span class=pl-kos>::</span><span class=pl-en>from_utf8</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>s<span class=pl-kos>[</span>index..<span class=pl-kos>]</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>unwrap</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>bench_push_str</span><span class=pl-kos>(</span><span class=pl-s1>c</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>Criterion</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> group = c<span class=pl-kos>.</span><span class=pl-en>benchmark_group</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;push_str&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> xs = <span class=pl-kos>[</span><span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-c1>1</span><span class=pl-kos>,</span> <span class=pl-c1>35</span><span class=pl-kos>,</span> <span class=pl-c1>36</span><span class=pl-kos>,</span> <span class=pl-c1>37</span><span class=pl-kos>,</span> u64<span class=pl-kos>::</span><span class=pl-v>MAX</span> <span class=pl-k>as</span> <span class=pl-smi>u128</span><span class=pl-kos>,</span> u128<span class=pl-kos>::</span><span class=pl-v>MAX</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;old&amp;quot;</span><span class=pl-kos>,</span> |b| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> total = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-smi>String</span><span class=pl-kos>::</span><span class=pl-en>new</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>for</span> base <span class=pl-k>in</span> <span class=pl-c1>2</span>..<span class=pl-c1>37</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-k>for</span> n <span class=pl-k>in</span> xs <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    s<span class=pl-kos>.</span><span class=pl-en>clear</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    <span class=pl-en>push_str</span><span class=pl-kos>(</span>n<span class=pl-kos>,</span> base<span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> s<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L66\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;66\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC66\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    total += s<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L67\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;67\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC67\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L68\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;68\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC68\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L69\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;69\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC69\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            total</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L70\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;70\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC70\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L71\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;71\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC71\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L72\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;72\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC72\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;new&amp;quot;</span><span class=pl-kos>,</span> |b| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L73\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;73\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC73\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L74\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;74\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC74\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> total = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L75\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;75\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC75\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> s = <span class=pl-smi>String</span><span class=pl-kos>::</span><span class=pl-en>new</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L76\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;76\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC76\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>for</span> base <span class=pl-k>in</span> <span class=pl-c1>2</span>..<span class=pl-c1>37</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L77\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;77\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC77\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-k>for</span> n <span class=pl-k>in</span> xs <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L78\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;78\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC78\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    s<span class=pl-kos>.</span><span class=pl-en>clear</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L79\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;79\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC79\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    <span class=pl-en>push_str2</span><span class=pl-kos>(</span>n<span class=pl-kos>,</span> base<span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> s<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L80\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;80\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC80\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                    total += s<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L81\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;81\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC81\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L82\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;82\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC82\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L83\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;83\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC83\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            total</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L84\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;84\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC84\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L85\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;85\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC85\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L86\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;86\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC86\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>finish</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L87\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;87\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC87\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L88\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;88\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC88\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L89\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;89\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC89\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_group</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches, bench_push_str<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-base_n_benchmark-rs-L90\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;90\&quot;></td>\n          <td id=\&quot;file-base_n_benchmark-rs-LC90\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_main</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/ed14860ef597ab315d4129d5f8adb191/raw/7feffaa53811efc0bc916a0f54853ed11960df16/base_n_benchmark.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/ed14860ef597ab315d4129d5f8adb191#file-base_n_benchmark-rs\&quot;>\n          base_n_benchmark.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123789385" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-base_n_benchmark-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="base_n_benchmark.rs">
        <tbody><tr>
          <td id="file-base_n_benchmark-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-base_n_benchmark-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> criterion<span class="pl-kos">::</span><span class="pl-kos">{</span>criterion_group<span class="pl-kos">,</span> criterion_main<span class="pl-kos">,</span> <span class="pl-v">Criterion</span><span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-base_n_benchmark-rs-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-base_n_benchmark-rs-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> std<span class="pl-kos">::</span>str<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-base_n_benchmark-rs-LC4" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-base_n_benchmark-rs-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-v">MAX_BASE</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span> = <span class="pl-c1">64</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-base_n_benchmark-rs-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-v">ALPHANUMERIC_ONLY</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span> = <span class="pl-c1">62</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-base_n_benchmark-rs-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-v">CASE_INSENSITIVE</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span> = <span class="pl-c1">36</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-base_n_benchmark-rs-LC8" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-base_n_benchmark-rs-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-v">BASE_64</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-smi">u8</span><span class="pl-kos">;</span> <span class="pl-v">MAX_BASE</span><span class="pl-kos">]</span> =</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-base_n_benchmark-rs-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-s">b"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@$"</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-base_n_benchmark-rs-LC11" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-base_n_benchmark-rs-LC12" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">#<span class="pl-kos">[</span>inline<span class="pl-kos">]</span></span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-base_n_benchmark-rs-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">push_str</span><span class="pl-kos">(</span><span class="pl-k">mut</span> <span class="pl-s1">n</span><span class="pl-kos">:</span> <span class="pl-smi">u128</span><span class="pl-kos">,</span> <span class="pl-s1">base</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span><span class="pl-kos">,</span> <span class="pl-s1">output</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-base_n_benchmark-rs-LC14" class="blob-code blob-code-inner js-file-line">    <span class="pl-en">debug_assert</span><span class="pl-en">!</span><span class="pl-kos">(</span>base &gt;= <span class="pl-c1">2</span> &amp;&amp; base &lt;= <span class="pl-v">MAX_BASE</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-base_n_benchmark-rs-LC15" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-kos">[</span><span class="pl-c1">0u8</span><span class="pl-kos">;</span> <span class="pl-c1">128</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-base_n_benchmark-rs-LC16" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> index = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-base_n_benchmark-rs-LC17" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-base_n_benchmark-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> base = base <span class="pl-k">as</span> <span class="pl-smi">u128</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-base_n_benchmark-rs-LC19" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-base_n_benchmark-rs-LC20" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-base_n_benchmark-rs-LC21" class="blob-code blob-code-inner js-file-line">        s<span class="pl-kos">[</span>index<span class="pl-kos">]</span> = <span class="pl-v">BASE_64</span><span class="pl-kos">[</span><span class="pl-kos">(</span>n % base<span class="pl-kos">)</span> <span class="pl-k">as</span> <span class="pl-smi">usize</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-base_n_benchmark-rs-LC22" class="blob-code blob-code-inner js-file-line">        index += <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-base_n_benchmark-rs-LC23" class="blob-code blob-code-inner js-file-line">        n /= base<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-base_n_benchmark-rs-LC24" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-base_n_benchmark-rs-LC25" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> n == <span class="pl-c1">0</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-base_n_benchmark-rs-LC26" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-base_n_benchmark-rs-LC27" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-base_n_benchmark-rs-LC28" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-base_n_benchmark-rs-LC29" class="blob-code blob-code-inner js-file-line">    s<span class="pl-kos">[</span><span class="pl-c1">0</span>..index<span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-en">reverse</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-base_n_benchmark-rs-LC30" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-base_n_benchmark-rs-LC31" class="blob-code blob-code-inner js-file-line">    output<span class="pl-kos">.</span><span class="pl-en">push_str</span><span class="pl-kos">(</span>str<span class="pl-kos">::</span><span class="pl-en">from_utf8</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>s<span class="pl-kos">[</span><span class="pl-c1">0</span>..index<span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">unwrap</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-base_n_benchmark-rs-LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-base_n_benchmark-rs-LC33" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-base_n_benchmark-rs-LC34" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">#<span class="pl-kos">[</span>inline<span class="pl-kos">]</span></span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-base_n_benchmark-rs-LC35" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">push_str2</span><span class="pl-kos">(</span><span class="pl-k">mut</span> <span class="pl-s1">n</span><span class="pl-kos">:</span> <span class="pl-smi">u128</span><span class="pl-kos">,</span> <span class="pl-s1">base</span><span class="pl-kos">:</span> <span class="pl-smi">usize</span><span class="pl-kos">,</span> <span class="pl-s1">output</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">String</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-base_n_benchmark-rs-LC36" class="blob-code blob-code-inner js-file-line">    <span class="pl-en">debug_assert</span><span class="pl-en">!</span><span class="pl-kos">(</span>base &gt;= <span class="pl-c1">2</span> &amp;&amp; base &lt;= <span class="pl-v">MAX_BASE</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-base_n_benchmark-rs-LC37" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-kos">[</span><span class="pl-c1">0u8</span><span class="pl-kos">;</span> <span class="pl-c1">128</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-base_n_benchmark-rs-LC38" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> index = s<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-base_n_benchmark-rs-LC39" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-base_n_benchmark-rs-LC40" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> base = base <span class="pl-k">as</span> <span class="pl-smi">u128</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-base_n_benchmark-rs-LC41" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-base_n_benchmark-rs-LC42" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-base_n_benchmark-rs-LC43" class="blob-code blob-code-inner js-file-line">        index -= <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-base_n_benchmark-rs-LC44" class="blob-code blob-code-inner js-file-line">        s<span class="pl-kos">[</span>index<span class="pl-kos">]</span> = <span class="pl-v">BASE_64</span><span class="pl-kos">[</span><span class="pl-kos">(</span>n % base<span class="pl-kos">)</span> <span class="pl-k">as</span> <span class="pl-smi">usize</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-base_n_benchmark-rs-LC45" class="blob-code blob-code-inner js-file-line">        n /= base<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-base_n_benchmark-rs-LC46" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-base_n_benchmark-rs-LC47" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> n == <span class="pl-c1">0</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-base_n_benchmark-rs-LC48" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-base_n_benchmark-rs-LC49" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-base_n_benchmark-rs-LC50" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-base_n_benchmark-rs-LC51" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-base_n_benchmark-rs-LC52" class="blob-code blob-code-inner js-file-line">    output<span class="pl-kos">.</span><span class="pl-en">push_str</span><span class="pl-kos">(</span>str<span class="pl-kos">::</span><span class="pl-en">from_utf8</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>s<span class="pl-kos">[</span>index..<span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">unwrap</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-base_n_benchmark-rs-LC53" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-base_n_benchmark-rs-LC54" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-base_n_benchmark-rs-LC55" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">bench_push_str</span><span class="pl-kos">(</span><span class="pl-s1">c</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Criterion</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-base_n_benchmark-rs-LC56" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> group = c<span class="pl-kos">.</span><span class="pl-en">benchmark_group</span><span class="pl-kos">(</span><span class="pl-s">"push_str"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-base_n_benchmark-rs-LC57" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> xs = <span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">35</span><span class="pl-kos">,</span> <span class="pl-c1">36</span><span class="pl-kos">,</span> <span class="pl-c1">37</span><span class="pl-kos">,</span> u64<span class="pl-kos">::</span><span class="pl-v">MAX</span> <span class="pl-k">as</span> <span class="pl-smi">u128</span><span class="pl-kos">,</span> u128<span class="pl-kos">::</span><span class="pl-v">MAX</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-base_n_benchmark-rs-LC58" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"old"</span><span class="pl-kos">,</span> |b| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-base_n_benchmark-rs-LC59" class="blob-code blob-code-inner js-file-line">        b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-base_n_benchmark-rs-LC60" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> total = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-base_n_benchmark-rs-LC61" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-smi">String</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-base_n_benchmark-rs-LC62" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">for</span> base <span class="pl-k">in</span> <span class="pl-c1">2</span>..<span class="pl-c1">37</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-base_n_benchmark-rs-LC63" class="blob-code blob-code-inner js-file-line">                <span class="pl-k">for</span> n <span class="pl-k">in</span> xs <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-base_n_benchmark-rs-LC64" class="blob-code blob-code-inner js-file-line">                    s<span class="pl-kos">.</span><span class="pl-en">clear</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-base_n_benchmark-rs-LC65" class="blob-code blob-code-inner js-file-line">                    <span class="pl-en">push_str</span><span class="pl-kos">(</span>n<span class="pl-kos">,</span> base<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> s<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L66" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="66"></td>
          <td id="file-base_n_benchmark-rs-LC66" class="blob-code blob-code-inner js-file-line">                    total += s<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L67" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="67"></td>
          <td id="file-base_n_benchmark-rs-LC67" class="blob-code blob-code-inner js-file-line">                <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L68" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="68"></td>
          <td id="file-base_n_benchmark-rs-LC68" class="blob-code blob-code-inner js-file-line">            <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L69" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="69"></td>
          <td id="file-base_n_benchmark-rs-LC69" class="blob-code blob-code-inner js-file-line">            total</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L70" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="70"></td>
          <td id="file-base_n_benchmark-rs-LC70" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L71" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="71"></td>
          <td id="file-base_n_benchmark-rs-LC71" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L72" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="72"></td>
          <td id="file-base_n_benchmark-rs-LC72" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"new"</span><span class="pl-kos">,</span> |b| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L73" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="73"></td>
          <td id="file-base_n_benchmark-rs-LC73" class="blob-code blob-code-inner js-file-line">        b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L74" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="74"></td>
          <td id="file-base_n_benchmark-rs-LC74" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> total = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L75" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="75"></td>
          <td id="file-base_n_benchmark-rs-LC75" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> s = <span class="pl-smi">String</span><span class="pl-kos">::</span><span class="pl-en">new</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L76" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="76"></td>
          <td id="file-base_n_benchmark-rs-LC76" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">for</span> base <span class="pl-k">in</span> <span class="pl-c1">2</span>..<span class="pl-c1">37</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L77" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="77"></td>
          <td id="file-base_n_benchmark-rs-LC77" class="blob-code blob-code-inner js-file-line">                <span class="pl-k">for</span> n <span class="pl-k">in</span> xs <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L78" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="78"></td>
          <td id="file-base_n_benchmark-rs-LC78" class="blob-code blob-code-inner js-file-line">                    s<span class="pl-kos">.</span><span class="pl-en">clear</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L79" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="79"></td>
          <td id="file-base_n_benchmark-rs-LC79" class="blob-code blob-code-inner js-file-line">                    <span class="pl-en">push_str2</span><span class="pl-kos">(</span>n<span class="pl-kos">,</span> base<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> s<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L80" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="80"></td>
          <td id="file-base_n_benchmark-rs-LC80" class="blob-code blob-code-inner js-file-line">                    total += s<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L81" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="81"></td>
          <td id="file-base_n_benchmark-rs-LC81" class="blob-code blob-code-inner js-file-line">                <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L82" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="82"></td>
          <td id="file-base_n_benchmark-rs-LC82" class="blob-code blob-code-inner js-file-line">            <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L83" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="83"></td>
          <td id="file-base_n_benchmark-rs-LC83" class="blob-code blob-code-inner js-file-line">            total</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L84" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="84"></td>
          <td id="file-base_n_benchmark-rs-LC84" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L85" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="85"></td>
          <td id="file-base_n_benchmark-rs-LC85" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L86" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="86"></td>
          <td id="file-base_n_benchmark-rs-LC86" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">finish</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L87" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="87"></td>
          <td id="file-base_n_benchmark-rs-LC87" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L88" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="88"></td>
          <td id="file-base_n_benchmark-rs-LC88" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L89" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="89"></td>
          <td id="file-base_n_benchmark-rs-LC89" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_group</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches, bench_push_str<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-base_n_benchmark-rs-L90" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="90"></td>
          <td id="file-base_n_benchmark-rs-LC90" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_main</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/ed14860ef597ab315d4129d5f8adb191/raw/7feffaa53811efc0bc916a0f54853ed11960df16/base_n_benchmark.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/ed14860ef597ab315d4129d5f8adb191#file-base_n_benchmark-rs">
          base_n_benchmark.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>this small change even managed to result in a modest win on M1 macbook air:</p><p><code>Running benches/base_n_benchmark.rs (target/release/deps/base_n_benchmark-825fe5895b5c2693)
push_str/old            time:   [14.180 &#181;s 14.313 &#181;s 14.462 &#181;s]
                        Performance has improved.
Found 5 outliers among 100 measurements (5.00%)
  4 (4.00%) high mild
  1 (1.00%) high severe
push_str/new            time:   [13.741 &#181;s 13.839 &#181;s 13.973 &#181;s]
                        Performance has improved.
Found 8 outliers among 100 measurements (8.00%)
  3 (3.00%) high mild
  5 (5.00%) high severe</code>
</p><p>There is also a chance that at this point you&#8217;re using rustc with <a href="https://github.com/rust-lang/rust/pull/114306">this change</a>.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Speeding up rustc data structures.]]></title><description><![CDATA[Or algorithm composition for shorter and faster code.]]></description><link>https://softwarebits.substack.com/p/speeding-up-rustc-data-structures</link><guid isPermaLink="false">https://softwarebits.substack.com/p/speeding-up-rustc-data-structures</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 02 Sep 2023 23:32:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Pb0a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve recently started exploring rustc codebase and noticed</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123761291\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-mod-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;mod.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-mod-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// Uses a sorted slice `data: &amp;amp;[E]` as a kind of &amp;quot;multi-map&amp;quot;. The</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// `key_fn` extracts a key of type `K` from the data, and this</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// function finds the range of elements that match the key. `data`</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// must have been sorted as if by a call to `sort_by_key` for this to</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// work.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>binary_search_slice</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span><span class=pl-kos>,</span> <span class=pl-smi>E</span><span class=pl-kos>,</span> <span class=pl-smi>K</span><span class=pl-kos>&amp;gt;</span><span class=pl-kos>(</span><span class=pl-s1>data</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span><span class=pl-kos>,</span> <span class=pl-s1>key_fn</span><span class=pl-kos>:</span> <span class=pl-k>impl</span> <span class=pl-smi>Fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>E</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>K</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-smi>K</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>where</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-smi>K</span><span class=pl-kos>:</span> <span class=pl-smi>Ord</span><span class=pl-kos>,</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-v>Ok</span><span class=pl-kos>(</span>mid<span class=pl-kos>)</span> = data<span class=pl-kos>.</span><span class=pl-en>binary_search_by_key</span><span class=pl-kos>(</span>key<span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span>key_fn<span class=pl-kos>)</span><span class=pl-kos></span> <span class=pl-smi>else</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        return<span class=pl-kos></span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> size = data<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// We get back *some* element with the given key -- so do</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// a galloping search backwards to find the *first* one.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> start = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> previous = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> step = <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        start = start<span class=pl-kos>.</span><span class=pl-en>saturating_sub</span><span class=pl-kos>(</span>step<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> start == <span class=pl-c1>0</span> || <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        previous = start<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step *= <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    step = previous - start<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>while</span> step &amp;gt; <span class=pl-c1>1</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> half = step / <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> mid = start + half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>mid<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            start = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step -= half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// adjust by one if we have overshot</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>if</span> start &amp;lt; size &amp;amp;&amp;amp; <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        start += <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Now search forward to find the *last* one.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> end = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> previous = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> step = <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        end = end<span class=pl-kos>.</span><span class=pl-en>saturating_add</span><span class=pl-kos>(</span>step<span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>min</span><span class=pl-kos>(</span>size<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> end == size || <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>end<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        previous = end<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step *= <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    step = end - previous<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>while</span> step &amp;gt; <span class=pl-c1>1</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> half = step / <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> mid = end - half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>mid<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            end = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step -= half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start..end<span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-mod-rs-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-mod-rs-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/839a15eff4e250aac3b4ce51bf286edf/raw/391edbcde3ca67051478017ca0cf7533033bde8d/mod.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/839a15eff4e250aac3b4ce51bf286edf#file-mod-rs\&quot;>\n          mod.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123761291" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-mod-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="mod.rs">
        <tbody><tr>
          <td id="file-mod-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-mod-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// Uses a sorted slice `data: &amp;[E]` as a kind of "multi-map". The</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-mod-rs-LC2" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// `key_fn` extracts a key of type `K` from the data, and this</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-mod-rs-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// function finds the range of elements that match the key. `data`</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-mod-rs-LC4" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// must have been sorted as if by a call to `sort_by_key` for this to</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-mod-rs-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// work.</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-mod-rs-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">binary_search_slice</span><span class="pl-kos">&lt;</span><span class="pl-c1">'</span><span class="pl-ent">d</span><span class="pl-kos">,</span> <span class="pl-smi">E</span><span class="pl-kos">,</span> <span class="pl-smi">K</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-s1">key_fn</span><span class="pl-kos">:</span> <span class="pl-k">impl</span> <span class="pl-smi">Fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span><span class="pl-smi">E</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">K</span><span class="pl-kos">,</span> <span class="pl-s1">key</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">K</span><span class="pl-kos">)</span> -&gt; <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-mod-rs-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">where</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-mod-rs-LC8" class="blob-code blob-code-inner js-file-line">    <span class="pl-smi">K</span><span class="pl-kos">:</span> <span class="pl-smi">Ord</span><span class="pl-kos">,</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-mod-rs-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-mod-rs-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-v">Ok</span><span class="pl-kos">(</span>mid<span class="pl-kos">)</span> = data<span class="pl-kos">.</span><span class="pl-en">binary_search_by_key</span><span class="pl-kos">(</span>key<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span>key_fn<span class="pl-kos">)</span><span class="pl-kos"></span> <span class="pl-smi">else</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-mod-rs-LC11" class="blob-code blob-code-inner js-file-line">        return<span class="pl-kos"></span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-mod-rs-LC12" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-mod-rs-LC13" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> size = data<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-mod-rs-LC14" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-mod-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-mod-rs-LC15" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// We get back *some* element with the given key -- so do</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-mod-rs-LC16" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// a galloping search backwards to find the *first* one.</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-mod-rs-LC17" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> start = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-mod-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> previous = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-mod-rs-LC19" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> step = <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-mod-rs-LC20" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-mod-rs-LC21" class="blob-code blob-code-inner js-file-line">        start = start<span class="pl-kos">.</span><span class="pl-en">saturating_sub</span><span class="pl-kos">(</span>step<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-mod-rs-LC22" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> start == <span class="pl-c1">0</span> || <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-mod-rs-LC23" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-mod-rs-LC24" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-mod-rs-LC25" class="blob-code blob-code-inner js-file-line">        previous = start<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-mod-rs-LC26" class="blob-code blob-code-inner js-file-line">        step *= <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-mod-rs-LC27" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-mod-rs-LC28" class="blob-code blob-code-inner js-file-line">    step = previous - start<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-mod-rs-LC29" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">while</span> step &gt; <span class="pl-c1">1</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-mod-rs-LC30" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> half = step / <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-mod-rs-LC31" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> mid = start + half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-mod-rs-LC32" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>mid<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-mod-rs-LC33" class="blob-code blob-code-inner js-file-line">            start = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-mod-rs-LC34" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-mod-rs-LC35" class="blob-code blob-code-inner js-file-line">        step -= half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-mod-rs-LC36" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-mod-rs-LC37" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// adjust by one if we have overshot</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-mod-rs-LC38" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">if</span> start &lt; size &amp;&amp; <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-mod-rs-LC39" class="blob-code blob-code-inner js-file-line">        start += <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-mod-rs-LC40" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-mod-rs-LC41" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-mod-rs-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-mod-rs-LC42" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Now search forward to find the *last* one.</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-mod-rs-LC43" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> end = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-mod-rs-LC44" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> previous = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-mod-rs-LC45" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> step = <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-mod-rs-LC46" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-mod-rs-LC47" class="blob-code blob-code-inner js-file-line">        end = end<span class="pl-kos">.</span><span class="pl-en">saturating_add</span><span class="pl-kos">(</span>step<span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">min</span><span class="pl-kos">(</span>size<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-mod-rs-LC48" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> end == size || <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>end<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-mod-rs-LC49" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-mod-rs-LC50" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-mod-rs-LC51" class="blob-code blob-code-inner js-file-line">        previous = end<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-mod-rs-LC52" class="blob-code blob-code-inner js-file-line">        step *= <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-mod-rs-LC53" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-mod-rs-LC54" class="blob-code blob-code-inner js-file-line">    step = end - previous<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-mod-rs-LC55" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">while</span> step &gt; <span class="pl-c1">1</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-mod-rs-LC56" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> half = step / <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-mod-rs-LC57" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> mid = end - half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-mod-rs-LC58" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>mid<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-mod-rs-LC59" class="blob-code blob-code-inner js-file-line">            end = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-mod-rs-LC60" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-mod-rs-LC61" class="blob-code blob-code-inner js-file-line">        step -= half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-mod-rs-LC62" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-mod-rs-LC63" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-mod-rs-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-mod-rs-LC64" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start..end<span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-mod-rs-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-mod-rs-LC65" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/839a15eff4e250aac3b4ce51bf286edf/raw/391edbcde3ca67051478017ca0cf7533033bde8d/mod.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/839a15eff4e250aac3b4ce51bf286edf#file-mod-rs">
          mod.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>Attentive reader would notice that this function is essentially <a href="https://en.cppreference.com/w/cpp/algorithm/equal_range">std::equal_range</a> from C++ but with much more involved implementation. Even with usual std lib uglifiers, C++ <a href="https://github.com/llvm/llvm-project/blob/main/libcxx/include/__algorithm/equal_range.h">LLVM implementation</a> is much easier to understand and reason about:</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123761319\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-equal_range-h\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-c  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;C++\&quot; data-tagsearch-path=\&quot;equal_range.h\&quot;>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>template </span>&amp;lt;<span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>_AlgPolicy</span>, <span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>_Compare</span>, <span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>_Iter</span>, <span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>_Sent</span>, <span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>_Tp</span>, <span class=\&quot;pl-k\&quot;>class</span> <span class=\&quot;pl-en\&quot;>_Proj</span>&amp;gt;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair&amp;lt;_Iter, _Iter&amp;gt;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>__equal_range</span>(_Iter __first, _Sent __last, <span class=\&quot;pl-k\&quot;>const</span> _Tp&amp;amp; __value, _Compare&amp;amp;&amp;amp; __comp, _Proj&amp;amp;&amp;amp; __proj) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>auto</span> __len  = _IterOps&amp;lt;_AlgPolicy&amp;gt;::<span class=\&quot;pl-c1\&quot;>distance</span>(__first, __last);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  _Iter __end = _IterOps&amp;lt;_AlgPolicy&amp;gt;::<span class=\&quot;pl-c1\&quot;>next</span>(__first, __last);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>while</span> (__len != <span class=\&quot;pl-c1\&quot;>0</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>auto</span> __half_len = <span class=\&quot;pl-c1\&quot;>std::__half_positive</span>(__len);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    _Iter __mid     = _IterOps&amp;lt;_AlgPolicy&amp;gt;::<span class=\&quot;pl-c1\&quot;>next</span>(__first, __half_len);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>if</span> (<span class=\&quot;pl-c1\&quot;>std::__invoke</span>(__comp, <span class=\&quot;pl-c1\&quot;>std::__invoke</span>(__proj, *__mid), __value)) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      __first = ++__mid;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      __len -= __half_len + <span class=\&quot;pl-c1\&quot;>1</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    } <span class=\&quot;pl-k\&quot;>else</span> <span class=\&quot;pl-k\&quot;>if</span> (<span class=\&quot;pl-c1\&quot;>std::__invoke</span>(__comp, __value, <span class=\&quot;pl-c1\&quot;>std::__invoke</span>(__proj, *__mid))) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      __end = __mid;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      __len = __half_len;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    } <span class=\&quot;pl-k\&quot;>else</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      _Iter __mp1 = __mid;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>      <span class=\&quot;pl-k\&quot;>return</span> pair&amp;lt;_Iter, _Iter&amp;gt;(</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>          std::__lower_bound&amp;lt;_AlgPolicy&amp;gt;(__first, __mid, __value, __comp, __proj),</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>          std::__upper_bound&amp;lt;_AlgPolicy&amp;gt;(++__mp1, __end, __value, __comp, __proj));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>return</span> pair&amp;lt;_Iter, _Iter&amp;gt;(__first, __first);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-equal_range-h-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-equal_range-h-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/be42b9596c0210b671c713ddbd3733da/raw/047ca726da70280a9258fb9b50fba71b4ff26345/equal_range.h\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/be42b9596c0210b671c713ddbd3733da#file-equal_range-h\&quot;>\n          equal_range.h\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123761319" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-equal_range-h" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-c  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="C++" data-tagsearch-path="equal_range.h">
        <tbody><tr>
          <td id="file-equal_range-h-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-equal_range-h-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">template </span>&lt;<span class="pl-k">class</span> <span class="pl-en">_AlgPolicy</span>, <span class="pl-k">class</span> <span class="pl-en">_Compare</span>, <span class="pl-k">class</span> <span class="pl-en">_Iter</span>, <span class="pl-k">class</span> <span class="pl-en">_Sent</span>, <span class="pl-k">class</span> <span class="pl-en">_Tp</span>, <span class="pl-k">class</span> <span class="pl-en">_Proj</span>&gt;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-equal_range-h-LC2" class="blob-code blob-code-inner js-file-line">_LIBCPP_HIDE_FROM_ABI _LIBCPP_CONSTEXPR_SINCE_CXX20 pair&lt;_Iter, _Iter&gt;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-equal_range-h-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-en">__equal_range</span>(_Iter __first, _Sent __last, <span class="pl-k">const</span> _Tp&amp; __value, _Compare&amp;&amp; __comp, _Proj&amp;&amp; __proj) {</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-equal_range-h-LC4" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">auto</span> __len  = _IterOps&lt;_AlgPolicy&gt;::<span class="pl-c1">distance</span>(__first, __last);</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-equal_range-h-LC5" class="blob-code blob-code-inner js-file-line">  _Iter __end = _IterOps&lt;_AlgPolicy&gt;::<span class="pl-c1">next</span>(__first, __last);</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-equal_range-h-LC6" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">while</span> (__len != <span class="pl-c1">0</span>) {</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-equal_range-h-LC7" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">auto</span> __half_len = <span class="pl-c1">std::__half_positive</span>(__len);</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-equal_range-h-LC8" class="blob-code blob-code-inner js-file-line">    _Iter __mid     = _IterOps&lt;_AlgPolicy&gt;::<span class="pl-c1">next</span>(__first, __half_len);</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-equal_range-h-LC9" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">if</span> (<span class="pl-c1">std::__invoke</span>(__comp, <span class="pl-c1">std::__invoke</span>(__proj, *__mid), __value)) {</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-equal_range-h-LC10" class="blob-code blob-code-inner js-file-line">      __first = ++__mid;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-equal_range-h-LC11" class="blob-code blob-code-inner js-file-line">      __len -= __half_len + <span class="pl-c1">1</span>;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-equal_range-h-LC12" class="blob-code blob-code-inner js-file-line">    } <span class="pl-k">else</span> <span class="pl-k">if</span> (<span class="pl-c1">std::__invoke</span>(__comp, __value, <span class="pl-c1">std::__invoke</span>(__proj, *__mid))) {</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-equal_range-h-LC13" class="blob-code blob-code-inner js-file-line">      __end = __mid;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-equal_range-h-LC14" class="blob-code blob-code-inner js-file-line">      __len = __half_len;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-equal_range-h-LC15" class="blob-code blob-code-inner js-file-line">    } <span class="pl-k">else</span> {</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-equal_range-h-LC16" class="blob-code blob-code-inner js-file-line">      _Iter __mp1 = __mid;</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-equal_range-h-LC17" class="blob-code blob-code-inner js-file-line">      <span class="pl-k">return</span> pair&lt;_Iter, _Iter&gt;(</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-equal_range-h-LC18" class="blob-code blob-code-inner js-file-line">          std::__lower_bound&lt;_AlgPolicy&gt;(__first, __mid, __value, __comp, __proj),</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-equal_range-h-LC19" class="blob-code blob-code-inner js-file-line">          std::__upper_bound&lt;_AlgPolicy&gt;(++__mp1, __end, __value, __comp, __proj));</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-equal_range-h-LC20" class="blob-code blob-code-inner js-file-line">    }</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-equal_range-h-LC21" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-equal_range-h-LC22" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">return</span> pair&lt;_Iter, _Iter&gt;(__first, __first);</td>
        </tr>
        <tr>
          <td id="file-equal_range-h-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-equal_range-h-LC23" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/be42b9596c0210b671c713ddbd3733da/raw/047ca726da70280a9258fb9b50fba71b4ff26345/equal_range.h" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/be42b9596c0210b671c713ddbd3733da#file-equal_range-h">
          equal_range.h
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>The reason behind its simplicity is the fact that it uses std::lower_bound and std::upper_bound to locate range start and end.</p><p>Unfortunately, Rust doesn&#8217;t have a lower/upper bound functions, but we can use <a href="https://doc.rust-lang.org/std/primitive.slice.html#method.partition_point">partition_point</a> to simulate both. Using this function we can rewrite binary_search_slice as follows:</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123761345\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-binary_search_slice-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;binary_search_slice.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>binary_search_slice_new</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span><span class=pl-kos>,</span> <span class=pl-smi>E</span><span class=pl-kos>,</span> <span class=pl-smi>K</span><span class=pl-kos>&amp;gt;</span><span class=pl-kos>(</span><span class=pl-s1>data</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span><span class=pl-kos>,</span> <span class=pl-s1>key_fn</span><span class=pl-kos>:</span> <span class=pl-k>impl</span> <span class=pl-smi>Fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>E</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>K</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-smi>K</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>where</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-smi>K</span><span class=pl-kos>:</span> <span class=pl-smi>Ord</span><span class=pl-kos>,</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> size = data<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> start = data<span class=pl-kos>.</span><span class=pl-en>partition_point</span><span class=pl-kos>(</span>|x| <span class=pl-en>key_fn</span><span class=pl-kos>(</span>x<span class=pl-kos>)</span> &amp;lt; <span class=pl-c1>*</span>key<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// At this point `start` either points at the first entry with equal or</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// greater key or is equal to `size` in case all elements have smaller keys</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: start == size || key_fn(&amp;amp;data[start]) &amp;gt;= *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>if</span> start == size || <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>return</span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: start &amp;lt; size &amp;amp;&amp;amp; key_fn(&amp;amp;data[start]) == *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Find the first entry with key &amp;gt; `key`. Skip `start` entries since</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// key_fn(&amp;amp;data[start]) == *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: offset == size ||  key_fn(&amp;amp;data[offset]) &amp;gt;= *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> offset = start + <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> end = data<span class=pl-kos>[</span>offset..<span class=pl-kos>]</span><span class=pl-kos>.</span><span class=pl-en>partition_point</span><span class=pl-kos>(</span>|x| <span class=pl-en>key_fn</span><span class=pl-kos>(</span>x<span class=pl-kos>)</span> &amp;lt;= <span class=pl-c1>*</span>key<span class=pl-kos>)</span> + offset<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: end == size || key_fn(&amp;amp;data[end]) &amp;gt; *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start..end<span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-binary_search_slice-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-binary_search_slice-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/48ce5fbbf485f4ea06400c4049eb2eb0/raw/0306fa0d98bbd17883f00eef9adb93adf39438a0/binary_search_slice.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/48ce5fbbf485f4ea06400c4049eb2eb0#file-binary_search_slice-rs\&quot;>\n          binary_search_slice.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123761345" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-binary_search_slice-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="binary_search_slice.rs">
        <tbody><tr>
          <td id="file-binary_search_slice-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-binary_search_slice-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">binary_search_slice_new</span><span class="pl-kos">&lt;</span><span class="pl-c1">'</span><span class="pl-ent">d</span><span class="pl-kos">,</span> <span class="pl-smi">E</span><span class="pl-kos">,</span> <span class="pl-smi">K</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-s1">key_fn</span><span class="pl-kos">:</span> <span class="pl-k">impl</span> <span class="pl-smi">Fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span><span class="pl-smi">E</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">K</span><span class="pl-kos">,</span> <span class="pl-s1">key</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">K</span><span class="pl-kos">)</span> -&gt; <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-binary_search_slice-rs-LC2" class="blob-code blob-code-inner js-file-line"><span class="pl-k">where</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-binary_search_slice-rs-LC3" class="blob-code blob-code-inner js-file-line">    <span class="pl-smi">K</span><span class="pl-kos">:</span> <span class="pl-smi">Ord</span><span class="pl-kos">,</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-binary_search_slice-rs-LC4" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-binary_search_slice-rs-LC5" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> size = data<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-binary_search_slice-rs-LC6" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> start = data<span class="pl-kos">.</span><span class="pl-en">partition_point</span><span class="pl-kos">(</span>|x| <span class="pl-en">key_fn</span><span class="pl-kos">(</span>x<span class="pl-kos">)</span> &lt; <span class="pl-c1">*</span>key<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-binary_search_slice-rs-LC7" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// At this point `start` either points at the first entry with equal or</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-binary_search_slice-rs-LC8" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// greater key or is equal to `size` in case all elements have smaller keys</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-binary_search_slice-rs-LC9" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: start == size || key_fn(&amp;data[start]) &gt;= *key</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-binary_search_slice-rs-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">if</span> start == size || <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-binary_search_slice-rs-LC11" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">return</span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-binary_search_slice-rs-LC12" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-binary_search_slice-rs-LC13" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: start &lt; size &amp;&amp; key_fn(&amp;data[start]) == *key</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-binary_search_slice-rs-LC14" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-binary_search_slice-rs-LC15" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Find the first entry with key &gt; `key`. Skip `start` entries since</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-binary_search_slice-rs-LC16" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// key_fn(&amp;data[start]) == *key</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-binary_search_slice-rs-LC17" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: offset == size ||  key_fn(&amp;data[offset]) &gt;= *key</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-binary_search_slice-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> offset = start + <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-binary_search_slice-rs-LC19" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> end = data<span class="pl-kos">[</span>offset..<span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-en">partition_point</span><span class="pl-kos">(</span>|x| <span class="pl-en">key_fn</span><span class="pl-kos">(</span>x<span class="pl-kos">)</span> &lt;= <span class="pl-c1">*</span>key<span class="pl-kos">)</span> + offset<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-binary_search_slice-rs-LC20" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: end == size || key_fn(&amp;data[end]) &gt; *key</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-binary_search_slice-rs-LC21" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-binary_search_slice-rs-LC22" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start..end<span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-binary_search_slice-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-binary_search_slice-rs-LC23" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/48ce5fbbf485f4ea06400c4049eb2eb0/raw/0306fa0d98bbd17883f00eef9adb93adf39438a0/binary_search_slice.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/48ce5fbbf485f4ea06400c4049eb2eb0#file-binary_search_slice-rs">
          binary_search_slice.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>I&#8217;ve added comments with invariants so that readers can easily convince themselves in correctness of proposed implementation and it&#8217;s still significantly shorter than original implementation. In fact, it&#8217;s possible to make it even shorter by skipping the if on line 10 and unconditionally returning &amp;data[start..end], since in case there are no elements with matching key, start and end would be equal making start..end range empty. The reason I decided not to go with this implementation is because it would increase the number of comparisons in the worst case.</p><p>Since there is a popular myth that performant code is more complex, some readers would start wondering about performance implications of such change. Let&#8217;s find out using the following benchmark</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123761263\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-bin_search_slice_benchmark-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;bin_search_slice_benchmark.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> criterion<span class=pl-kos>::</span><span class=pl-kos>{</span>criterion_group<span class=pl-kos>,</span> criterion_main<span class=pl-kos>,</span> <span class=pl-v>Criterion</span><span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// Uses a sorted slice `data: &amp;amp;[E]` as a kind of &amp;quot;multi-map&amp;quot;. The</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// `key_fn` extracts a key of type `K` from the data, and this</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// function finds the range of elements that match the key. `data`</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// must have been sorted as if by a call to `sort_by_key` for this to</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// work.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>binary_search_slice</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span><span class=pl-kos>,</span> <span class=pl-smi>E</span><span class=pl-kos>,</span> <span class=pl-smi>K</span><span class=pl-kos>&amp;gt;</span><span class=pl-kos>(</span><span class=pl-s1>data</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span><span class=pl-kos>,</span> <span class=pl-s1>key_fn</span><span class=pl-kos>:</span> <span class=pl-k>impl</span> <span class=pl-smi>Fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>E</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>K</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-smi>K</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>where</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-smi>K</span><span class=pl-kos>:</span> <span class=pl-smi>Ord</span><span class=pl-kos>,</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-v>Ok</span><span class=pl-kos>(</span>mid<span class=pl-kos>)</span> = data<span class=pl-kos>.</span><span class=pl-en>binary_search_by_key</span><span class=pl-kos>(</span>key<span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span>key_fn<span class=pl-kos>)</span><span class=pl-kos></span> <span class=pl-smi>else</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        return<span class=pl-kos></span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> size = data<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// We get back *some* element with the given key -- so do</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// a galloping search backwards to find the *first* one.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> start = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> previous = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> step = <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        start = start<span class=pl-kos>.</span><span class=pl-en>saturating_sub</span><span class=pl-kos>(</span>step<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> start == <span class=pl-c1>0</span> || <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        previous = start<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step *= <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    step = previous - start<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>while</span> step &amp;gt; <span class=pl-c1>1</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> half = step / <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> mid = start + half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>mid<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            start = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step -= half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// adjust by one if we have overshot</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>if</span> start &amp;lt; size &amp;amp;&amp;amp; <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        start += <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Now search forward to find the *last* one.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> end = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> previous = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> step = <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>loop</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        end = end<span class=pl-kos>.</span><span class=pl-en>saturating_add</span><span class=pl-kos>(</span>step<span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>min</span><span class=pl-kos>(</span>size<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> end == size || <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>end<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>break</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        previous = end<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step *= <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    step = end - previous<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>while</span> step &amp;gt; <span class=pl-c1>1</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> half = step / <span class=pl-c1>2</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>let</span> mid = end - half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>if</span> <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>mid<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            end = mid<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        step -= half<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L66\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;66\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC66\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start..end<span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L67\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;67\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC67\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L68\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;68\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC68\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L69\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;69\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC69\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// Uses a sorted slice `data: &amp;amp;[E]` as a kind of &amp;quot;multi-map&amp;quot;. The</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L70\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;70\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC70\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// `key_fn` extracts a key of type `K` from the data, and this</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L71\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;71\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC71\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// function finds the range of elements that match the key. `data`</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L72\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;72\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC72\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// must have been sorted as if by a call to `sort_by_key` for this to</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L73\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;73\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC73\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c>/// work.</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L74\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;74\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC74\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>pub</span> <span class=pl-k>fn</span> <span class=pl-en>binary_search_slice_new</span><span class=pl-kos>&amp;lt;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span><span class=pl-kos>,</span> <span class=pl-smi>E</span><span class=pl-kos>,</span> <span class=pl-smi>K</span><span class=pl-kos>&amp;gt;</span><span class=pl-kos>(</span><span class=pl-s1>data</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span><span class=pl-kos>,</span> <span class=pl-s1>key_fn</span><span class=pl-kos>:</span> <span class=pl-k>impl</span> <span class=pl-smi>Fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span><span class=pl-smi>E</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>K</span><span class=pl-kos>,</span> <span class=pl-s1>key</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-smi>K</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>d</span> <span class=pl-kos>[</span><span class=pl-smi>E</span><span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L75\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;75\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC75\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>where</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L76\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;76\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC76\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-smi>K</span><span class=pl-kos>:</span> <span class=pl-smi>Ord</span><span class=pl-kos>,</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L77\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;77\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC77\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L78\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;78\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC78\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> size = data<span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L79\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;79\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC79\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> start = data<span class=pl-kos>.</span><span class=pl-en>partition_point</span><span class=pl-kos>(</span>|x| <span class=pl-en>key_fn</span><span class=pl-kos>(</span>x<span class=pl-kos>)</span> &amp;lt; <span class=pl-c1>*</span>key<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L80\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;80\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC80\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// At this point `start` either points at the first entry with equal or</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L81\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;81\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC81\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// greater key or is equal to `size` in case all elements have smaller keys</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L82\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;82\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC82\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: start == size || key_fn(&amp;amp;data[start]) &amp;gt;= *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L83\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;83\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC83\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>if</span> start == size || <span class=pl-en>key_fn</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start<span class=pl-kos>]</span><span class=pl-kos>)</span> != <span class=pl-c1>*</span>key <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L84\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;84\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC84\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-k>return</span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L85\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;85\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC85\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L86\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;86\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC86\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: start &amp;lt; size &amp;amp;&amp;amp; key_fn(&amp;amp;data[start]) == *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L87\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;87\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC87\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L88\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;88\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC88\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Find the first entry with key &amp;gt; `key`. Skip `start` entries since</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L89\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;89\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC89\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// key_fn(&amp;amp;data[start]) == *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L90\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;90\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC90\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: offset == size ||  key_fn(&amp;amp;data[offset]) &amp;gt;= *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L91\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;91\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC91\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> offset = start + <span class=pl-c1>1</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L92\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;92\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC92\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> end = data<span class=pl-kos>[</span>offset..<span class=pl-kos>]</span><span class=pl-kos>.</span><span class=pl-en>partition_point</span><span class=pl-kos>(</span>|x| <span class=pl-en>key_fn</span><span class=pl-kos>(</span>x<span class=pl-kos>)</span> &amp;lt;= <span class=pl-c1>*</span>key<span class=pl-kos>)</span> + offset<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L93\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;93\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC93\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c>// Invariant: end == size || key_fn(&amp;amp;data[end]) &amp;gt; *key</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L94\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;94\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC94\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L95\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;95\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC95\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>[</span>start..end<span class=pl-kos>]</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L96\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;96\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC96\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L97\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;97\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC97\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L98\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;98\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC98\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>bench_inserts</span><span class=pl-kos>(</span><span class=pl-s1>c</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>Criterion</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L99\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;99\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC99\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> group = c<span class=pl-kos>.</span><span class=pl-en>benchmark_group</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;multiply add&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L100\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;100\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC100\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> data = <span class=pl-kos>[</span><span class=pl-kos>(</span><span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-s>&amp;quot;zero&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>,</span> <span class=pl-kos>(</span><span class=pl-c1>3</span><span class=pl-kos>,</span> <span class=pl-s>&amp;quot;three-a&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>,</span> <span class=pl-kos>(</span><span class=pl-c1>3</span><span class=pl-kos>,</span> <span class=pl-s>&amp;quot;three-b&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>,</span> <span class=pl-kos>(</span><span class=pl-c1>22</span><span class=pl-kos>,</span> <span class=pl-s>&amp;quot;twenty-two&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L101\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;101\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC101\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> keys = <span class=pl-kos>[</span>-<span class=pl-c1>1</span><span class=pl-kos>,</span> <span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-c1>1</span><span class=pl-kos>,</span> <span class=pl-c1>2</span><span class=pl-kos>,</span> <span class=pl-c1>3</span><span class=pl-kos>,</span> <span class=pl-c1>22</span><span class=pl-kos>,</span> <span class=pl-c1>23</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L102\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;102\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC102\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;binary_search_slice&amp;quot;</span><span class=pl-kos>,</span> |b| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L103\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;103\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC103\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L104\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;104\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC104\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> total_len = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L105\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;105\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC105\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>for</span> key <span class=pl-k>in</span> keys <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L106\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;106\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC106\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                total_len += <span class=pl-en>binary_search_slice</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>,</span> |x| x<span class=pl-kos>.</span><span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span>key<span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L107\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;107\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC107\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L108\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;108\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC108\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            total_len</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L109\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;109\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC109\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L110\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;110\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC110\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L111\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;111\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC111\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;binary_search_slice_new&amp;quot;</span><span class=pl-kos>,</span> |b| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L112\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;112\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC112\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L113\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;113\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC113\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>let</span> <span class=pl-k>mut</span> total_len = <span class=pl-c1>0</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L114\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;114\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC114\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-k>for</span> key <span class=pl-k>in</span> keys <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L115\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;115\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC115\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>                total_len += <span class=pl-en>binary_search_slice_new</span><span class=pl-kos>(</span><span class=pl-c1>&amp;amp;</span>data<span class=pl-kos>,</span> |x| x<span class=pl-kos>.</span><span class=pl-c1>0</span><span class=pl-kos>,</span> <span class=pl-c1>&amp;amp;</span>key<span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>len</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L116\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;116\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC116\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            <span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L117\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;117\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC117\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>            total_len</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L118\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;118\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC118\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>        <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L119\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;119\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC119\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-kos>}</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L120\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;120\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC120\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>finish</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L121\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;121\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC121\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L122\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;122\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC122\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L123\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;123\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC123\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_group</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches, bench_inserts<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-L124\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;124\&quot;></td>\n          <td id=\&quot;file-bin_search_slice_benchmark-rs-LC124\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_main</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/63c0ed39ae132b131931fa1f8a3dea55/raw/ce12489a99173e7ee1cfe6aa97809ef95128e4d4/bin_search_slice_benchmark.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/63c0ed39ae132b131931fa1f8a3dea55#file-bin_search_slice_benchmark-rs\&quot;>\n          bin_search_slice_benchmark.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123761263" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-bin_search_slice_benchmark-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="bin_search_slice_benchmark.rs">
        <tbody><tr>
          <td id="file-bin_search_slice_benchmark-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> criterion<span class="pl-kos">::</span><span class="pl-kos">{</span>criterion_group<span class="pl-kos">,</span> criterion_main<span class="pl-kos">,</span> <span class="pl-v">Criterion</span><span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// Uses a sorted slice `data: &amp;[E]` as a kind of "multi-map". The</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC4" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// `key_fn` extracts a key of type `K` from the data, and this</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// function finds the range of elements that match the key. `data`</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC6" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// must have been sorted as if by a call to `sort_by_key` for this to</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// work.</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">binary_search_slice</span><span class="pl-kos">&lt;</span><span class="pl-c1">'</span><span class="pl-ent">d</span><span class="pl-kos">,</span> <span class="pl-smi">E</span><span class="pl-kos">,</span> <span class="pl-smi">K</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-s1">key_fn</span><span class="pl-kos">:</span> <span class="pl-k">impl</span> <span class="pl-smi">Fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span><span class="pl-smi">E</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">K</span><span class="pl-kos">,</span> <span class="pl-s1">key</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">K</span><span class="pl-kos">)</span> -&gt; <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">where</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-smi">K</span><span class="pl-kos">:</span> <span class="pl-smi">Ord</span><span class="pl-kos">,</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC11" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC12" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-v">Ok</span><span class="pl-kos">(</span>mid<span class="pl-kos">)</span> = data<span class="pl-kos">.</span><span class="pl-en">binary_search_by_key</span><span class="pl-kos">(</span>key<span class="pl-kos">,</span> <span class="pl-c1">&amp;</span>key_fn<span class="pl-kos">)</span><span class="pl-kos"></span> <span class="pl-smi">else</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC13" class="blob-code blob-code-inner js-file-line">        return<span class="pl-kos"></span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC14" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC15" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> size = data<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC16" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC17" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// We get back *some* element with the given key -- so do</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// a galloping search backwards to find the *first* one.</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC19" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> start = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC20" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> previous = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC21" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> step = <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC22" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC23" class="blob-code blob-code-inner js-file-line">        start = start<span class="pl-kos">.</span><span class="pl-en">saturating_sub</span><span class="pl-kos">(</span>step<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC24" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> start == <span class="pl-c1">0</span> || <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC25" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC26" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC27" class="blob-code blob-code-inner js-file-line">        previous = start<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC28" class="blob-code blob-code-inner js-file-line">        step *= <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC29" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC30" class="blob-code blob-code-inner js-file-line">    step = previous - start<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC31" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">while</span> step &gt; <span class="pl-c1">1</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC32" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> half = step / <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC33" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> mid = start + half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC34" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>mid<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC35" class="blob-code blob-code-inner js-file-line">            start = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC36" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC37" class="blob-code blob-code-inner js-file-line">        step -= half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC38" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC39" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// adjust by one if we have overshot</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC40" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">if</span> start &lt; size &amp;&amp; <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC41" class="blob-code blob-code-inner js-file-line">        start += <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC42" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC43" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC44" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Now search forward to find the *last* one.</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC45" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> end = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC46" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> previous = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC47" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> step = <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC48" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">loop</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC49" class="blob-code blob-code-inner js-file-line">        end = end<span class="pl-kos">.</span><span class="pl-en">saturating_add</span><span class="pl-kos">(</span>step<span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">min</span><span class="pl-kos">(</span>size<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC50" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> end == size || <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>end<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC51" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">break</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC52" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC53" class="blob-code blob-code-inner js-file-line">        previous = end<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC54" class="blob-code blob-code-inner js-file-line">        step *= <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC55" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC56" class="blob-code blob-code-inner js-file-line">    step = end - previous<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC57" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">while</span> step &gt; <span class="pl-c1">1</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC58" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> half = step / <span class="pl-c1">2</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC59" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">let</span> mid = end - half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC60" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">if</span> <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>mid<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC61" class="blob-code blob-code-inner js-file-line">            end = mid<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC62" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC63" class="blob-code blob-code-inner js-file-line">        step -= half<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC64" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC65" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L66" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="66"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC66" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start..end<span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L67" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="67"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC67" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L68" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="68"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC68" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L69" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="69"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC69" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// Uses a sorted slice `data: &amp;[E]` as a kind of "multi-map". The</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L70" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="70"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC70" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// `key_fn` extracts a key of type `K` from the data, and this</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L71" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="71"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC71" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// function finds the range of elements that match the key. `data`</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L72" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="72"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC72" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// must have been sorted as if by a call to `sort_by_key` for this to</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L73" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="73"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC73" class="blob-code blob-code-inner js-file-line"><span class="pl-c">/// work.</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L74" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="74"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC74" class="blob-code blob-code-inner js-file-line"><span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">binary_search_slice_new</span><span class="pl-kos">&lt;</span><span class="pl-c1">'</span><span class="pl-ent">d</span><span class="pl-kos">,</span> <span class="pl-smi">E</span><span class="pl-kos">,</span> <span class="pl-smi">K</span><span class="pl-kos">&gt;</span><span class="pl-kos">(</span><span class="pl-s1">data</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-s1">key_fn</span><span class="pl-kos">:</span> <span class="pl-k">impl</span> <span class="pl-smi">Fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span><span class="pl-smi">E</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">K</span><span class="pl-kos">,</span> <span class="pl-s1">key</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-smi">K</span><span class="pl-kos">)</span> -&gt; <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">d</span> <span class="pl-kos">[</span><span class="pl-smi">E</span><span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L75" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="75"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC75" class="blob-code blob-code-inner js-file-line"><span class="pl-k">where</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L76" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="76"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC76" class="blob-code blob-code-inner js-file-line">    <span class="pl-smi">K</span><span class="pl-kos">:</span> <span class="pl-smi">Ord</span><span class="pl-kos">,</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L77" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="77"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC77" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L78" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="78"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC78" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> size = data<span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L79" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="79"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC79" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> start = data<span class="pl-kos">.</span><span class="pl-en">partition_point</span><span class="pl-kos">(</span>|x| <span class="pl-en">key_fn</span><span class="pl-kos">(</span>x<span class="pl-kos">)</span> &lt; <span class="pl-c1">*</span>key<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L80" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="80"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC80" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// At this point `start` either points at the first entry with equal or</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L81" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="81"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC81" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// greater key or is equal to `size` in case all elements have smaller keys</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L82" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="82"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC82" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: start == size || key_fn(&amp;data[start]) &gt;= *key</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L83" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="83"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC83" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">if</span> start == size || <span class="pl-en">key_fn</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start<span class="pl-kos">]</span><span class="pl-kos">)</span> != <span class="pl-c1">*</span>key <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L84" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="84"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC84" class="blob-code blob-code-inner js-file-line">        <span class="pl-k">return</span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L85" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="85"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC85" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L86" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="86"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC86" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: start &lt; size &amp;&amp; key_fn(&amp;data[start]) == *key</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L87" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="87"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC87" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L88" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="88"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC88" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Find the first entry with key &gt; `key`. Skip `start` entries since</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L89" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="89"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC89" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// key_fn(&amp;data[start]) == *key</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L90" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="90"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC90" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: offset == size ||  key_fn(&amp;data[offset]) &gt;= *key</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L91" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="91"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC91" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> offset = start + <span class="pl-c1">1</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L92" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="92"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC92" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> end = data<span class="pl-kos">[</span>offset..<span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-en">partition_point</span><span class="pl-kos">(</span>|x| <span class="pl-en">key_fn</span><span class="pl-kos">(</span>x<span class="pl-kos">)</span> &lt;= <span class="pl-c1">*</span>key<span class="pl-kos">)</span> + offset<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L93" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="93"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC93" class="blob-code blob-code-inner js-file-line">    <span class="pl-c">// Invariant: end == size || key_fn(&amp;data[end]) &gt; *key</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L94" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="94"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC94" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L95" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="95"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC95" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">&amp;</span>data<span class="pl-kos">[</span>start..end<span class="pl-kos">]</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L96" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="96"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC96" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L97" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="97"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC97" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L98" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="98"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC98" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">bench_inserts</span><span class="pl-kos">(</span><span class="pl-s1">c</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Criterion</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L99" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="99"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC99" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> group = c<span class="pl-kos">.</span><span class="pl-en">benchmark_group</span><span class="pl-kos">(</span><span class="pl-s">"multiply add"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L100" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="100"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC100" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> data = <span class="pl-kos">[</span><span class="pl-kos">(</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-s">"zero"</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">3</span><span class="pl-kos">,</span> <span class="pl-s">"three-a"</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">3</span><span class="pl-kos">,</span> <span class="pl-s">"three-b"</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-c1">22</span><span class="pl-kos">,</span> <span class="pl-s">"twenty-two"</span><span class="pl-kos">)</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L101" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="101"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC101" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> keys = <span class="pl-kos">[</span>-<span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">,</span> <span class="pl-c1">22</span><span class="pl-kos">,</span> <span class="pl-c1">23</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L102" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="102"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC102" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"binary_search_slice"</span><span class="pl-kos">,</span> |b| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L103" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="103"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC103" class="blob-code blob-code-inner js-file-line">        b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L104" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="104"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC104" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> total_len = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L105" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="105"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC105" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">for</span> key <span class="pl-k">in</span> keys <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L106" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="106"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC106" class="blob-code blob-code-inner js-file-line">                total_len += <span class="pl-en">binary_search_slice</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">,</span> |x| x<span class="pl-kos">.</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">&amp;</span>key<span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L107" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="107"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC107" class="blob-code blob-code-inner js-file-line">            <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L108" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="108"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC108" class="blob-code blob-code-inner js-file-line">            total_len</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L109" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="109"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC109" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L110" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="110"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC110" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L111" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="111"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC111" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"binary_search_slice_new"</span><span class="pl-kos">,</span> |b| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L112" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="112"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC112" class="blob-code blob-code-inner js-file-line">        b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L113" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="113"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC113" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">let</span> <span class="pl-k">mut</span> total_len = <span class="pl-c1">0</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L114" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="114"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC114" class="blob-code blob-code-inner js-file-line">            <span class="pl-k">for</span> key <span class="pl-k">in</span> keys <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L115" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="115"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC115" class="blob-code blob-code-inner js-file-line">                total_len += <span class="pl-en">binary_search_slice_new</span><span class="pl-kos">(</span><span class="pl-c1">&amp;</span>data<span class="pl-kos">,</span> |x| x<span class="pl-kos">.</span><span class="pl-c1">0</span><span class="pl-kos">,</span> <span class="pl-c1">&amp;</span>key<span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">len</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L116" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="116"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC116" class="blob-code blob-code-inner js-file-line">            <span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L117" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="117"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC117" class="blob-code blob-code-inner js-file-line">            total_len</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L118" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="118"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC118" class="blob-code blob-code-inner js-file-line">        <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L119" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="119"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC119" class="blob-code blob-code-inner js-file-line">    <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L120" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="120"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC120" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">finish</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L121" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="121"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC121" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L122" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="122"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC122" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L123" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="123"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC123" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_group</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches, bench_inserts<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-bin_search_slice_benchmark-rs-L124" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="124"></td>
          <td id="file-bin_search_slice_benchmark-rs-LC124" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_main</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/63c0ed39ae132b131931fa1f8a3dea55/raw/ce12489a99173e7ee1cfe6aa97809ef95128e4d4/bin_search_slice_benchmark.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/63c0ed39ae132b131931fa1f8a3dea55#file-bin_search_slice_benchmark-rs">
          bin_search_slice_benchmark.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>And the results on my M1 macbook air are</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pb0a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pb0a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 424w, https://substackcdn.com/image/fetch/$s_!Pb0a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 848w, https://substackcdn.com/image/fetch/$s_!Pb0a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 1272w, https://substackcdn.com/image/fetch/$s_!Pb0a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pb0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png" width="1456" height="808" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:808,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:249288,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Pb0a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 424w, https://substackcdn.com/image/fetch/$s_!Pb0a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 848w, https://substackcdn.com/image/fetch/$s_!Pb0a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 1272w, https://substackcdn.com/image/fetch/$s_!Pb0a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5ce21f7b-c8f3-458c-9203-c15799b2b568_1676x930.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>suggesting ~20% runtime improvement. Not bad for a code cleanup?</p><p>This is yet another reminder to follow Alexander Stepanov&#8217;s algorithm design principles and leverage algorithm composition.</p><p>P.S.: these suggestions are part of https://github.com/rust-lang/rust/pull/114231</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Fixing famous binary search bug efficiently.]]></title><description><![CDATA[Or fewer instructions FTW!]]></description><link>https://softwarebits.substack.com/p/fixing-famous-binary-search-bug-efficiently</link><guid isPermaLink="false">https://softwarebits.substack.com/p/fixing-famous-binary-search-bug-efficiently</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sun, 27 Aug 2023 00:31:08 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_96l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Jon Bentley was a renowned computer scientist and author of the book &#8220;<em>Programming Pearls&#8221;</em>. In one of the chapters of the book, he described an algorithm for binary search, a well-known search algorithm that finds the position of a given value in a sorted array.</p><p>Bentley's implementation of binary search was correct for most cases, but it contained a subtle bug that could cause it to fail for large arrays. The bug was in the line of code that calculated the midpoint of the array. Bentley's code used the following expression to calculate the midpoint:</p><pre><code>int mid = (low + high) / 2; </code></pre><p>This expression works correctly for most cases, but it can overflow for large values of the variables <code>low</code> and <code>high</code>. In fact, helpful compilers can point out such bugs in obvious cases like the <a href="https://godbolt.org/z/vzd7aeq9E">one below</a></p><pre><code><strong>warning: overflow in expression; result is -4 with type 'int' [-Winteger-overflow]
</strong>return (std::numeric_limits&lt;int&gt;::max() - 2 + std::numeric_limits&lt;int&gt;::max()) / 2;</code></pre><p>This means that if <code>low</code> is <code>std::numeric_limits&lt;int&gt;::max() - 2</code> and <code>high</code> is <code>std::numeric_limits&lt;int&gt;::max()</code>, then the expression <code>(low + high) / 2</code> will overflow and produce the value -4 and result in undefined behavior.</p><p>The bug in Bentley's binary search implementation went undetected for over 20 years and its fix usually looks something like</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_96l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_96l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 424w, https://substackcdn.com/image/fetch/$s_!_96l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 848w, https://substackcdn.com/image/fetch/$s_!_96l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 1272w, https://substackcdn.com/image/fetch/$s_!_96l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_96l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png" width="864" height="410" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4442b283-e335-41cc-89ab-f072a0233a99_864x410.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:410,&quot;width&quot;:864,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87676,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!_96l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 424w, https://substackcdn.com/image/fetch/$s_!_96l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 848w, https://substackcdn.com/image/fetch/$s_!_96l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 1272w, https://substackcdn.com/image/fetch/$s_!_96l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4442b283-e335-41cc-89ab-f072a0233a99_864x410.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>It makes sense since we&#8217;d like to add half of the distance between low and high to get to their midpoint. Is this the best we can do though? I didn&#8217;t bother to find out until a few days ago when I accidentally noticed</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/golang/go/blob/master/src/sort/search.go#L63" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HimX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 424w, https://substackcdn.com/image/fetch/$s_!HimX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 848w, https://substackcdn.com/image/fetch/$s_!HimX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 1272w, https://substackcdn.com/image/fetch/$s_!HimX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HimX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png" width="1300" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:446,&quot;width&quot;:1300,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:104572,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/golang/go/blob/master/src/sort/search.go#L63&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HimX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 424w, https://substackcdn.com/image/fetch/$s_!HimX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 848w, https://substackcdn.com/image/fetch/$s_!HimX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 1272w, https://substackcdn.com/image/fetch/$s_!HimX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F529baa69-3eec-4723-a2f1-395a0a3fe190_1300x446.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>go Go&#8217;s implementation of <a href="https://github.com/golang/go/blob/master/src/sort/search.go#L63">sort.Search</a>. Even if adding two huge signed integers results in overflow, by casting their sum to unsigned int, we can use the sign bit to store an overflow. After shifting the number by 1 bit to the right the sign bit is no longer set and we can cast it back to signed version.</p><p>To see what difference it makes, let&#8217;s take a look below implementations of midpoint</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist124349933\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-midpoint-cpp\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-c  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;C++\&quot; data-tagsearch-path=\&quot;midpoint.cpp\&quot;>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-en\&quot;>midpointb</span>(<span class=\&quot;pl-k\&quot;>int</span> l, <span class=\&quot;pl-k\&quot;>int</span> r) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>return</span> (l + r) &amp;gt;&amp;gt; <span class=\&quot;pl-c1\&quot;>1</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-en\&quot;>midpointw</span>(<span class=\&quot;pl-k\&quot;>int</span> l, <span class=\&quot;pl-k\&quot;>int</span> r) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>return</span> l + (r - l) / <span class=\&quot;pl-c1\&quot;>2</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-en\&quot;>midpoint</span>(<span class=\&quot;pl-k\&quot;>int</span> l, <span class=\&quot;pl-k\&quot;>int</span> r) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>return</span> <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>int</span>&amp;gt;(l) + <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>int</span>&amp;gt;(r) &amp;gt;&amp;gt; <span class=\&quot;pl-c1\&quot;>1</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint-cpp-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-midpoint-cpp-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/df69ba55a57f64b2ddc591975aa90de8/raw/42becdb2b46bc8d898591c16b5a21588e78916f7/midpoint.cpp\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/df69ba55a57f64b2ddc591975aa90de8#file-midpoint-cpp\&quot;>\n          midpoint.cpp\n        </a>\n        hosted with &amp;#10084; by <a class=\&quot;Link--inTextBlock\&quot; href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-0e9bf67cc0c6.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-0e9bf67cc0c6.css"><div id="gist124349933" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-midpoint-cpp" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-c  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a class="Link--inTextBlock" href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="C++" data-tagsearch-path="midpoint.cpp">
        <tbody><tr>
          <td id="file-midpoint-cpp-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-midpoint-cpp-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> <span class="pl-en">midpointb</span>(<span class="pl-k">int</span> l, <span class="pl-k">int</span> r) {</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-midpoint-cpp-LC2" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">return</span> (l + r) &gt;&gt; <span class="pl-c1">1</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-midpoint-cpp-LC3" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-midpoint-cpp-LC4" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-midpoint-cpp-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> <span class="pl-en">midpointw</span>(<span class="pl-k">int</span> l, <span class="pl-k">int</span> r) {</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-midpoint-cpp-LC6" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">return</span> l + (r - l) / <span class="pl-c1">2</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-midpoint-cpp-LC7" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-midpoint-cpp-LC8" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-midpoint-cpp-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> <span class="pl-en">midpoint</span>(<span class="pl-k">int</span> l, <span class="pl-k">int</span> r) {</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-midpoint-cpp-LC10" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">return</span> <span class="pl-k">static_cast</span>&lt;<span class="pl-k">unsigned</span> <span class="pl-k">int</span>&gt;(l) + <span class="pl-k">static_cast</span>&lt;<span class="pl-k">unsigned</span> <span class="pl-k">int</span>&gt;(r) &gt;&gt; <span class="pl-c1">1</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint-cpp-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-midpoint-cpp-LC11" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/df69ba55a57f64b2ddc591975aa90de8/raw/42becdb2b46bc8d898591c16b5a21588e78916f7/midpoint.cpp" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/df69ba55a57f64b2ddc591975aa90de8#file-midpoint-cpp">
          midpoint.cpp
        </a>
        hosted with &#10084; by <a class="Link--inTextBlock" href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>where midpointb is the common buggy version, midpointw - common working version and midpoint - the optimized alternative. midpointw clearly uses more instructions and as such is likely to be more expensive.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/Mfn4GaMK5" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yac8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 424w, https://substackcdn.com/image/fetch/$s_!Yac8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 848w, https://substackcdn.com/image/fetch/$s_!Yac8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 1272w, https://substackcdn.com/image/fetch/$s_!Yac8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yac8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png" width="1432" height="968" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:968,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173242,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/Mfn4GaMK5&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Yac8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 424w, https://substackcdn.com/image/fetch/$s_!Yac8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 848w, https://substackcdn.com/image/fetch/$s_!Yac8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 1272w, https://substackcdn.com/image/fetch/$s_!Yac8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F98b324db-7dc0-42ab-9bfd-e80c4ba8e6b8_1432x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>What&#8217;s interesting though is how similar midpointb and midpoint assemblies are. In fact, it&#8217;s just a 1 letter difference s<strong>a</strong>r vs s<strong>h</strong>r. It&#8217;s a very important difference though - SAR preserves the most significant bit, unlike SHR, so even when we shift the overflow bit to the right, it&#8217;s still going to affect the sign bit in the resulting signed integer and cause the wrong result.</p><p>Go&#8217;s assembly is a little different but the idea is the same</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://compiler-explorer.com/z/r1dqzfher" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!am9u!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 424w, https://substackcdn.com/image/fetch/$s_!am9u!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 848w, https://substackcdn.com/image/fetch/$s_!am9u!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!am9u!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!am9u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png" width="1440" height="1042" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1042,&quot;width&quot;:1440,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:263325,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://compiler-explorer.com/z/r1dqzfher&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!am9u!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 424w, https://substackcdn.com/image/fetch/$s_!am9u!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 848w, https://substackcdn.com/image/fetch/$s_!am9u!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 1272w, https://substackcdn.com/image/fetch/$s_!am9u!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7cd389c8-5d0e-4684-a8c3-5ad4c23f88da_1440x1042.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And here&#8217;s the same in Zig</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MhL2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MhL2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 424w, https://substackcdn.com/image/fetch/$s_!MhL2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 848w, https://substackcdn.com/image/fetch/$s_!MhL2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 1272w, https://substackcdn.com/image/fetch/$s_!MhL2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MhL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png" width="1448" height="818" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:818,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:181454,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MhL2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 424w, https://substackcdn.com/image/fetch/$s_!MhL2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 848w, https://substackcdn.com/image/fetch/$s_!MhL2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 1272w, https://substackcdn.com/image/fetch/$s_!MhL2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3c312618-2987-4cc3-bd6c-05d2eb8a78e2_1448x818.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and its assembly</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/chKEq7M6f" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!l_LK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 424w, https://substackcdn.com/image/fetch/$s_!l_LK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 848w, https://substackcdn.com/image/fetch/$s_!l_LK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!l_LK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!l_LK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png" width="840" height="1154" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1154,&quot;width&quot;:840,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:173451,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/chKEq7M6f&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!l_LK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 424w, https://substackcdn.com/image/fetch/$s_!l_LK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 848w, https://substackcdn.com/image/fetch/$s_!l_LK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 1272w, https://substackcdn.com/image/fetch/$s_!l_LK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27b6b6ad-5c3e-47d7-9807-b9389c5d3f7f_840x1154.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Does it matter in practice though? Let&#8217;s see</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123647486\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-midpoint_bench-cpp\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-c  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;C++\&quot; data-tagsearch-path=\&quot;midpoint_bench.cpp\&quot;>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>#<span class=\&quot;pl-k\&quot;>include</span> <span class=\&quot;pl-s\&quot;><span class=\&quot;pl-pds\&quot;>&amp;lt;</span>numeric<span class=\&quot;pl-pds\&quot;>&amp;gt;</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-en\&quot;>midpointb</span>(<span class=\&quot;pl-k\&quot;>int</span> l, <span class=\&quot;pl-k\&quot;>int</span> r) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>return</span> (l + r) &amp;gt;&amp;gt; <span class=\&quot;pl-c1\&quot;>1</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-en\&quot;>midpointw</span>(<span class=\&quot;pl-k\&quot;>int</span> l, <span class=\&quot;pl-k\&quot;>int</span> r) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>return</span> l + (r - l) / <span class=\&quot;pl-c1\&quot;>2</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> <span class=\&quot;pl-en\&quot;>midpoint</span>(<span class=\&quot;pl-k\&quot;>int</span> l, <span class=\&quot;pl-k\&quot;>int</span> r) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-k\&quot;>return</span> <span class=\&quot;pl-k\&quot;>static_cast</span>&amp;lt;<span class=\&quot;pl-k\&quot;>unsigned</span> <span class=\&quot;pl-k\&quot;>int</span>&amp;gt;(l + r) &amp;gt;&amp;gt; <span class=\&quot;pl-c1\&quot;>1</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> L = std::numeric_limits&amp;lt;<span class=\&quot;pl-k\&quot;>int</span>&amp;gt;::max();</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>int</span> R = L - <span class=\&quot;pl-c1\&quot;>2</span>;</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>MidpointW</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>midpointw</span>(L, R));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(MidpointW);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>Midpoint</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>midpoint</span>(L, R));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(Midpoint);</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-k\&quot;>static</span> <span class=\&quot;pl-k\&quot;>void</span> <span class=\&quot;pl-en\&quot;>StdMidpoint</span>(benchmark::State&amp;amp; state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  <span class=\&quot;pl-k\&quot;>for</span> (<span class=\&quot;pl-k\&quot;>auto</span> _ : state) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=\&quot;pl-c1\&quot;>benchmark::DoNotOptimize</span>(<span class=\&quot;pl-c1\&quot;>std::midpoint</span>(L, R));</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>  }</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-midpoint_bench-cpp-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-midpoint_bench-cpp-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=\&quot;pl-en\&quot;>BENCHMARK</span>(StdMidpoint);</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/7f2a4da2902d5ea8476c2e9077933e49/raw/b18b061b2bd83c4f2da501afa332a0331ffebd5b/midpoint_bench.cpp\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/7f2a4da2902d5ea8476c2e9077933e49#file-midpoint_bench-cpp\&quot;>\n          midpoint_bench.cpp\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123647486" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-midpoint_bench-cpp" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-c  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="C++" data-tagsearch-path="midpoint_bench.cpp">
        <tbody><tr>
          <td id="file-midpoint_bench-cpp-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-midpoint_bench-cpp-LC1" class="blob-code blob-code-inner js-file-line">#<span class="pl-k">include</span> <span class="pl-s"><span class="pl-pds">&lt;</span>numeric<span class="pl-pds">&gt;</span></span></td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-midpoint_bench-cpp-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-midpoint_bench-cpp-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> <span class="pl-en">midpointb</span>(<span class="pl-k">int</span> l, <span class="pl-k">int</span> r) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-midpoint_bench-cpp-LC4" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">return</span> (l + r) &gt;&gt; <span class="pl-c1">1</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-midpoint_bench-cpp-LC5" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-midpoint_bench-cpp-LC6" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-midpoint_bench-cpp-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> <span class="pl-en">midpointw</span>(<span class="pl-k">int</span> l, <span class="pl-k">int</span> r) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-midpoint_bench-cpp-LC8" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">return</span> l + (r - l) / <span class="pl-c1">2</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-midpoint_bench-cpp-LC9" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-midpoint_bench-cpp-LC10" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-midpoint_bench-cpp-LC11" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> <span class="pl-en">midpoint</span>(<span class="pl-k">int</span> l, <span class="pl-k">int</span> r) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-midpoint_bench-cpp-LC12" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">return</span> <span class="pl-k">static_cast</span>&lt;<span class="pl-k">unsigned</span> <span class="pl-k">int</span>&gt;(l + r) &gt;&gt; <span class="pl-c1">1</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-midpoint_bench-cpp-LC13" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-midpoint_bench-cpp-LC14" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-midpoint_bench-cpp-LC15" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> L = std::numeric_limits&lt;<span class="pl-k">int</span>&gt;::max();</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-midpoint_bench-cpp-LC16" class="blob-code blob-code-inner js-file-line"><span class="pl-k">int</span> R = L - <span class="pl-c1">2</span>;</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-midpoint_bench-cpp-LC17" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-midpoint_bench-cpp-LC18" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">MidpointW</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-midpoint_bench-cpp-LC19" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-midpoint_bench-cpp-LC20" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">midpointw</span>(L, R));</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-midpoint_bench-cpp-LC21" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-midpoint_bench-cpp-LC22" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-midpoint_bench-cpp-LC23" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(MidpointW);</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-midpoint_bench-cpp-LC24" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-midpoint_bench-cpp-LC25" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">Midpoint</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-midpoint_bench-cpp-LC26" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-midpoint_bench-cpp-LC27" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">midpoint</span>(L, R));</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-midpoint_bench-cpp-LC28" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-midpoint_bench-cpp-LC29" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-midpoint_bench-cpp-LC30" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(Midpoint);</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-midpoint_bench-cpp-LC31" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-midpoint_bench-cpp-LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-k">static</span> <span class="pl-k">void</span> <span class="pl-en">StdMidpoint</span>(benchmark::State&amp; state) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-midpoint_bench-cpp-LC33" class="blob-code blob-code-inner js-file-line">  <span class="pl-k">for</span> (<span class="pl-k">auto</span> _ : state) {</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-midpoint_bench-cpp-LC34" class="blob-code blob-code-inner js-file-line">    <span class="pl-c1">benchmark::DoNotOptimize</span>(<span class="pl-c1">std::midpoint</span>(L, R));</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-midpoint_bench-cpp-LC35" class="blob-code blob-code-inner js-file-line">  }</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-midpoint_bench-cpp-LC36" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-midpoint_bench-cpp-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-midpoint_bench-cpp-LC37" class="blob-code blob-code-inner js-file-line"><span class="pl-en">BENCHMARK</span>(StdMidpoint);</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/7f2a4da2902d5ea8476c2e9077933e49/raw/b18b061b2bd83c4f2da501afa332a0331ffebd5b/midpoint_bench.cpp" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/7f2a4da2902d5ea8476c2e9077933e49#file-midpoint_bench-cpp">
          midpoint_bench.cpp
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>As expected our version is much faster than the recommended one</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/hIof5am90-S3qBdZRBiZCs6of7Q" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6Y35!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!6Y35!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!6Y35!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!6Y35!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6Y35!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png" width="1324" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://quick-bench.com/q/hIof5am90-S3qBdZRBiZCs6of7Q&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!6Y35!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!6Y35!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!6Y35!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!6Y35!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1adb98bf-83b2-47f7-92e1-c2da42775c7c_1324x662.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and and its also a lot faster than std::midpoint from the standard library.</p><p>Don&#8217;t forget to make sure that both variables indeed stay within positive range (0, max&#171;unsigned int&#187;), so &#8220;left&#8221; should be initialized as 0 and not -1, as some binary search implementations do.</p><p>You can play more with different implementations using links below:</p><p>Go&#8217;s compiler explorer - https://compiler-explorer.com/z/sz51jGM8s</p><p>Zig&#8217;s compiler explorer - https://godbolt.org/z/E5vez4sEv</p><p>C++ bench - https://quick-bench.com/q/hIof5am90-S3qBdZRBiZCs6of7Q</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Ternary search trie.]]></title><description><![CDATA[Or more space efficient trie implementation.]]></description><link>https://softwarebits.substack.com/p/ternary-search-trie</link><guid isPermaLink="false">https://softwarebits.substack.com/p/ternary-search-trie</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sat, 19 Aug 2023 23:20:07 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>We&#8217;ve discussed performance advantages of using Trie over std::unordered_set in</p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;59e93a2d-f6f4-4322-b37a-83e0b4df262b&quot;,&quot;caption&quot;:&quot;Imagine you have a bunch of registered users and your job is to quickly check if a particular user is in the list. Most, when faced with this question during a coding interview, would immediately suggest using hashtable, known as std::unordered_set in C++. And, while it&#8217;s not incorrect, our candidate hasn&#8217;t asked anything about the input and that&#8217;s alre&#8230;&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;showDescription&quot;:true,&quot;showImage&quot;:true,&quot;size&quot;:&quot;lg&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;Trie vs std::unordered_set.&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:9216302,&quot;name&quot;:&quot;Taras Tsugrii&quot;,&quot;bio&quot;:&quot;Software Engineer, Coach, Mentor, Host and Organizer of Performance Summit and Scaling Continuous Delivery&quot;,&quot;photo_url&quot;:&quot;https://bucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com/public/images/1b58387f-127d-4cb1-b581-a062ef5d20af_2320x3088.png&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2023-04-23T00:41:13.360Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3bec49b4-b8a0-4e8c-a799-1618607346e7_1464x1676.png&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://softwarebits.substack.com/p/trie-vs-stdunordered_set&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:115299524,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:2,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Software Bits Newsletter&quot;,&quot;publication_logo_url&quot;:&quot;&quot;,&quot;belowTheFold&quot;:false,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>and some of the readers raised a valid concern about its memory consumption, especially in case of large alphabets, e.g. unicode. I&#8217;ve briefly mentioned some of the common approaches that are used to address these concerns, but in this article I wanted to provide more details about possibly the easiest one to implement - ternary search trie.</p><p>So the problem we are trying to address is the amount of memory we waste on each trie node that has only few children</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oyz0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oyz0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oyz0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oyz0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oyz0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oyz0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg" width="640" height="495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:495,&quot;width&quot;:640,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Tree &amp; Trie In-class Questions&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Tree &amp; Trie In-class Questions" title="Tree &amp; Trie In-class Questions" srcset="https://substackcdn.com/image/fetch/$s_!oyz0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oyz0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oyz0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oyz0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe4fc1198-0e37-48a3-b698-ceb56850ae9b_640x495.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>A ternary search trie (TST) is a variation of a trie that uses three pointers instead of one for each child node. This makes ternary search trees more space-efficient than regular tries, but it also makes them slower for some operations.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2dwH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2dwH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 424w, https://substackcdn.com/image/fetch/$s_!2dwH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 848w, https://substackcdn.com/image/fetch/$s_!2dwH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 1272w, https://substackcdn.com/image/fetch/$s_!2dwH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2dwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png" width="341" height="210" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:210,&quot;width&quot;:341,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Ternary Search Tree Dictionary in C#: Faster String Dictionary! -  CodeProject&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Ternary Search Tree Dictionary in C#: Faster String Dictionary! -  CodeProject" title="Ternary Search Tree Dictionary in C#: Faster String Dictionary! -  CodeProject" srcset="https://substackcdn.com/image/fetch/$s_!2dwH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 424w, https://substackcdn.com/image/fetch/$s_!2dwH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 848w, https://substackcdn.com/image/fetch/$s_!2dwH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 1272w, https://substackcdn.com/image/fetch/$s_!2dwH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F365c101d-5677-4bf6-95e4-c93e43e0a07c_341x210.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>Each node in a TST represents a single character in a string. The three pointers for each child node point to nodes that represent the next characters in the string, in the following order:</p><ul><li><p>The left pointer points to a node that represents the next character in the string if the character is less than the character at the current node.</p></li><li><p>The equal pointer points to a node that represents the next character in the string if the character is equal to the character at the current node.</p></li><li><p>The right pointer points to a node that represents the next character in the string if the character is greater than the character at the current node.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/z6a6b5WE9" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HnQ4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 424w, https://substackcdn.com/image/fetch/$s_!HnQ4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 848w, https://substackcdn.com/image/fetch/$s_!HnQ4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 1272w, https://substackcdn.com/image/fetch/$s_!HnQ4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HnQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png" width="1432" height="2830" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2830,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:568159,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/z6a6b5WE9&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HnQ4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 424w, https://substackcdn.com/image/fetch/$s_!HnQ4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 848w, https://substackcdn.com/image/fetch/$s_!HnQ4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 1272w, https://substackcdn.com/image/fetch/$s_!HnQ4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3e4e7995-b0a5-41c3-b16f-239a783d45b2_1432x2830.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Above implementation is recursive and is focused more on ease of understanding instead of performance, but just for fun let&#8217;s see how it compares to std::unordered_set in terms of insertion runtime</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/vlqBdzRHRTpR6L5T6sJVOp-3eQ4" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kfkv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 424w, https://substackcdn.com/image/fetch/$s_!kfkv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 848w, https://substackcdn.com/image/fetch/$s_!kfkv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 1272w, https://substackcdn.com/image/fetch/$s_!kfkv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kfkv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png" width="1432" height="1974" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1974,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:460972,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://quick-bench.com/q/vlqBdzRHRTpR6L5T6sJVOp-3eQ4&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kfkv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 424w, https://substackcdn.com/image/fetch/$s_!kfkv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 848w, https://substackcdn.com/image/fetch/$s_!kfkv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 1272w, https://substackcdn.com/image/fetch/$s_!kfkv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fddf97628-8b44-43df-8fd3-f90e0b550f32_1432x1974.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And looks like even our naive TST implementation manages to beat std::unordered_set</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://quick-bench.com/q/vlqBdzRHRTpR6L5T6sJVOp-3eQ4" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NZNB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!NZNB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!NZNB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!NZNB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NZNB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png" width="1324" height="662" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:662,&quot;width&quot;:1324,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:&quot;https://quick-bench.com/q/vlqBdzRHRTpR6L5T6sJVOp-3eQ4&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NZNB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 424w, https://substackcdn.com/image/fetch/$s_!NZNB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 848w, https://substackcdn.com/image/fetch/$s_!NZNB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 1272w, https://substackcdn.com/image/fetch/$s_!NZNB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feef1d6df-15b3-4c44-b2df-0c90f231ea32_1324x662.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Don&#8217;t forget that for some characters TST nodes serve a routing role, which means that the traversal path can be 2X longer than the path in a regular trie. As such before deciding which implementation to use it would be a good idea to benchmark its insert and search runtime using the data representable of your production workloads.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Faster math in Rust?]]></title><description><![CDATA[Or compiler intrinsics FTW!]]></description><link>https://softwarebits.substack.com/p/faster-math-in-rust</link><guid isPermaLink="false">https://softwarebits.substack.com/p/faster-math-in-rust</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sun, 13 Aug 2023 00:00:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Compiler intrinsics are functions that are provided by the compiler to give programmers direct access to low-level machine instructions. This can be useful for performance-critical code, as it allows the programmer to write code that is specifically optimized for the target processor.</p><p>Intrinsics are typically implemented as inline functions, which means that the compiler will replace the intrinsic call with the actual machine instructions at compile time. This allows the compiler to optimize the intrinsic call for the target processor, and it also eliminates the overhead of function call and return.</p><p>For the reasons above and many more I love casually browsing intrinsics documentation for different languages. Last time I was reading about <a href="https://doc.rust-lang.org/std/intrinsics/index.html">Rust intrinsics</a> I noticed 4 functions with suffix _fast that seem particularly fitting for our quest for improving performance. Let&#8217;s take a look at <a href="https://doc.rust-lang.org/std/intrinsics/fn.fadd_fast.html">fadd_fast</a> for example. Its documentation is somewhat sparse</p><blockquote><p>Float addition that allows optimizations based on algebraic rules. May assume inputs are finite.</p></blockquote><p>so to better understand how we can use it, let&#8217;s do a little investigation. We&#8217;ll start with</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/Gb5zjecEj" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!unC2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 424w, https://substackcdn.com/image/fetch/$s_!unC2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 848w, https://substackcdn.com/image/fetch/$s_!unC2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 1272w, https://substackcdn.com/image/fetch/$s_!unC2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!unC2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png" width="1448" height="484" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:484,&quot;width&quot;:1448,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111792,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/Gb5zjecEj&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!unC2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 424w, https://substackcdn.com/image/fetch/$s_!unC2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 848w, https://substackcdn.com/image/fetch/$s_!unC2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 1272w, https://substackcdn.com/image/fetch/$s_!unC2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60ac7491-889b-4f4e-a3c6-b257e7d49484_1448x484.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>and look at the generated assembly</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/Gb5zjecEj" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!phTR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 424w, https://substackcdn.com/image/fetch/$s_!phTR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 848w, https://substackcdn.com/image/fetch/$s_!phTR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 1272w, https://substackcdn.com/image/fetch/$s_!phTR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!phTR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png" width="848" height="632" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:632,&quot;width&quot;:848,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:107439,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/Gb5zjecEj&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!phTR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 424w, https://substackcdn.com/image/fetch/$s_!phTR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 848w, https://substackcdn.com/image/fetch/$s_!phTR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 1272w, https://substackcdn.com/image/fetch/$s_!phTR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe0ca4657-4490-4567-9c4f-bf0747ff913c_848x632.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Apart from the register order it doesn&#8217;t seem like there is any difference, so it doesn&#8217;t seem like it&#8217;s going to deliver on its &#8220;fast&#8221; promise. But wait, what if by &#8220;algebraic rules&#8221; documentation means that compiler would treat addition for f32 as associative, which is not the case by default. To test our hypothesis, let&#8217;s see what happens when many f32s are added together</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://godbolt.org/z/488jPzYnd" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Lh4D!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 424w, https://substackcdn.com/image/fetch/$s_!Lh4D!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 848w, https://substackcdn.com/image/fetch/$s_!Lh4D!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 1272w, https://substackcdn.com/image/fetch/$s_!Lh4D!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Lh4D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png" width="1296" height="632" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:632,&quot;width&quot;:1296,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:129734,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://godbolt.org/z/488jPzYnd&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Lh4D!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 424w, https://substackcdn.com/image/fetch/$s_!Lh4D!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 848w, https://substackcdn.com/image/fetch/$s_!Lh4D!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 1272w, https://substackcdn.com/image/fetch/$s_!Lh4D!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32a81a13-adf4-480f-8d70-5bbd541000da_1296x632.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now we&#8217;re talking!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sZSz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sZSz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 424w, https://substackcdn.com/image/fetch/$s_!sZSz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 848w, https://substackcdn.com/image/fetch/$s_!sZSz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 1272w, https://substackcdn.com/image/fetch/$s_!sZSz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sZSz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png" width="1280" height="3648" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:3648,&quot;width&quot;:1280,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:585827,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sZSz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 424w, https://substackcdn.com/image/fetch/$s_!sZSz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 848w, https://substackcdn.com/image/fetch/$s_!sZSz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 1272w, https://substackcdn.com/image/fetch/$s_!sZSz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43ad16c0-b0e9-4fc3-a1bd-e3d408166021_1280x3648.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The ymm* instead of xmm* looks very promising but how much difference does it make in practice?</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123405706\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-fadd_fast_bench-rs\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-rust  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Rust\&quot; data-tagsearch-path=\&quot;fadd_fast_bench.rs\&quot;>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-c1>#!<span class=pl-kos>[</span>feature<span class=pl-kos>(</span>core_intrinsics<span class=pl-kos>)</span><span class=pl-kos>]</span></span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> std<span class=pl-kos>::</span>intrinsics<span class=pl-kos>::</span>fadd_fast<span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>use</span> criterion<span class=pl-kos>::</span><span class=pl-kos>{</span>criterion_group<span class=pl-kos>,</span> criterion_main<span class=pl-kos>,</span> <span class=pl-v>Criterion</span><span class=pl-kos>}</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>const</span> <span class=pl-v>XS</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-c1>&amp;#39;</span><span class=pl-ent>static</span> <span class=pl-kos>[</span><span class=pl-smi>f32</span><span class=pl-kos>]</span> = <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-c1>3.14</span><span class=pl-kos>;</span> <span class=pl-c1>1000</span><span class=pl-kos>]</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>slow_sum</span><span class=pl-kos>(</span><span class=pl-s1>xs</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-smi>f32</span><span class=pl-kos>]</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>f32</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    xs<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>sum</span><span class=pl-kos>(</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>fast_sum</span><span class=pl-kos>(</span><span class=pl-s1>xs</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-kos>[</span><span class=pl-smi>f32</span><span class=pl-kos>]</span><span class=pl-kos>)</span> -&amp;gt; <span class=pl-smi>f32</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    xs<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>.</span><span class=pl-en>fold</span><span class=pl-kos>(</span><span class=pl-c1>0.0</span><span class=pl-kos>,</span> |x<span class=pl-kos>,</span> y| <span class=pl-k>unsafe</span> <span class=pl-kos>{</span> <span class=pl-en>fadd_fast</span><span class=pl-kos>(</span>x<span class=pl-kos>,</span> <span class=pl-c1>*</span>y<span class=pl-kos>)</span> <span class=pl-kos>}</span><span class=pl-kos>)</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>fn</span> <span class=pl-en>bench_sums</span><span class=pl-kos>(</span><span class=pl-s1>c</span><span class=pl-kos>:</span> <span class=pl-c1>&amp;amp;</span><span class=pl-k>mut</span> <span class=pl-smi>Criterion</span><span class=pl-kos>)</span> <span class=pl-kos>{</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    <span class=pl-k>let</span> <span class=pl-k>mut</span> group = c<span class=pl-kos>.</span><span class=pl-en>benchmark_group</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;f32 sum&amp;quot;</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;slow sum&amp;quot;</span><span class=pl-kos>,</span> |b| b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-en>slow_sum</span><span class=pl-kos>(</span><span class=pl-v>XS</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>bench_function</span><span class=pl-kos>(</span><span class=pl-s>&amp;quot;fast sum&amp;quot;</span><span class=pl-kos>,</span> |b| b<span class=pl-kos>.</span><span class=pl-en>iter</span><span class=pl-kos>(</span>|| <span class=pl-en>fast_sum</span><span class=pl-kos>(</span><span class=pl-v>XS</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>    group<span class=pl-kos>.</span><span class=pl-en>finish</span><span class=pl-kos>(</span><span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-kos>}</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_group</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches, bench_sums<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-fadd_fast_bench-rs-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-fadd_fast_bench-rs-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-en>criterion_main</span><span class=pl-en>!</span><span class=pl-kos>(</span>benches<span class=pl-kos>)</span><span class=pl-kos>;</span></td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/2639a984ce4e693e1b44df1715cd4be7/raw/566839a49a79c772d26f44778a4e9e879207ab79/fadd_fast_bench.rs\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/2639a984ce4e693e1b44df1715cd4be7#file-fadd_fast_bench-rs\&quot;>\n          fadd_fast_bench.rs\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123405706" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-fadd_fast_bench-rs" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-rust  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Rust" data-tagsearch-path="fadd_fast_bench.rs">
        <tbody><tr>
          <td id="file-fadd_fast_bench-rs-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-fadd_fast_bench-rs-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">#!<span class="pl-kos">[</span>feature<span class="pl-kos">(</span>core_intrinsics<span class="pl-kos">)</span><span class="pl-kos">]</span></span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-fadd_fast_bench-rs-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-fadd_fast_bench-rs-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> std<span class="pl-kos">::</span>intrinsics<span class="pl-kos">::</span>fadd_fast<span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-fadd_fast_bench-rs-LC4" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-fadd_fast_bench-rs-LC5" class="blob-code blob-code-inner js-file-line"><span class="pl-k">use</span> criterion<span class="pl-kos">::</span><span class="pl-kos">{</span>criterion_group<span class="pl-kos">,</span> criterion_main<span class="pl-kos">,</span> <span class="pl-v">Criterion</span><span class="pl-kos">}</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-fadd_fast_bench-rs-LC6" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-fadd_fast_bench-rs-LC7" class="blob-code blob-code-inner js-file-line"><span class="pl-k">const</span> <span class="pl-v">XS</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-c1">'</span><span class="pl-ent">static</span> <span class="pl-kos">[</span><span class="pl-smi">f32</span><span class="pl-kos">]</span> = <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-c1">3.14</span><span class="pl-kos">;</span> <span class="pl-c1">1000</span><span class="pl-kos">]</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-fadd_fast_bench-rs-LC8" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-fadd_fast_bench-rs-LC9" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">slow_sum</span><span class="pl-kos">(</span><span class="pl-s1">xs</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-smi">f32</span><span class="pl-kos">]</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">f32</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-fadd_fast_bench-rs-LC10" class="blob-code blob-code-inner js-file-line">    xs<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">sum</span><span class="pl-kos">(</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-fadd_fast_bench-rs-LC11" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-fadd_fast_bench-rs-LC12" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-fadd_fast_bench-rs-LC13" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">fast_sum</span><span class="pl-kos">(</span><span class="pl-s1">xs</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-kos">[</span><span class="pl-smi">f32</span><span class="pl-kos">]</span><span class="pl-kos">)</span> -&gt; <span class="pl-smi">f32</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-fadd_fast_bench-rs-LC14" class="blob-code blob-code-inner js-file-line">    xs<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">fold</span><span class="pl-kos">(</span><span class="pl-c1">0.0</span><span class="pl-kos">,</span> |x<span class="pl-kos">,</span> y| <span class="pl-k">unsafe</span> <span class="pl-kos">{</span> <span class="pl-en">fadd_fast</span><span class="pl-kos">(</span>x<span class="pl-kos">,</span> <span class="pl-c1">*</span>y<span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-fadd_fast_bench-rs-LC15" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-fadd_fast_bench-rs-LC16" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-fadd_fast_bench-rs-LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">fn</span> <span class="pl-en">bench_sums</span><span class="pl-kos">(</span><span class="pl-s1">c</span><span class="pl-kos">:</span> <span class="pl-c1">&amp;</span><span class="pl-k">mut</span> <span class="pl-smi">Criterion</span><span class="pl-kos">)</span> <span class="pl-kos">{</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-fadd_fast_bench-rs-LC18" class="blob-code blob-code-inner js-file-line">    <span class="pl-k">let</span> <span class="pl-k">mut</span> group = c<span class="pl-kos">.</span><span class="pl-en">benchmark_group</span><span class="pl-kos">(</span><span class="pl-s">"f32 sum"</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-fadd_fast_bench-rs-LC19" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"slow sum"</span><span class="pl-kos">,</span> |b| b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-en">slow_sum</span><span class="pl-kos">(</span><span class="pl-v">XS</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-fadd_fast_bench-rs-LC20" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">bench_function</span><span class="pl-kos">(</span><span class="pl-s">"fast sum"</span><span class="pl-kos">,</span> |b| b<span class="pl-kos">.</span><span class="pl-en">iter</span><span class="pl-kos">(</span>|| <span class="pl-en">fast_sum</span><span class="pl-kos">(</span><span class="pl-v">XS</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-fadd_fast_bench-rs-LC21" class="blob-code blob-code-inner js-file-line">    group<span class="pl-kos">.</span><span class="pl-en">finish</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-fadd_fast_bench-rs-LC22" class="blob-code blob-code-inner js-file-line"><span class="pl-kos">}</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-fadd_fast_bench-rs-LC23" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-fadd_fast_bench-rs-LC24" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_group</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches, bench_sums<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
        <tr>
          <td id="file-fadd_fast_bench-rs-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-fadd_fast_bench-rs-LC25" class="blob-code blob-code-inner js-file-line"><span class="pl-en">criterion_main</span><span class="pl-en">!</span><span class="pl-kos">(</span>benches<span class="pl-kos">)</span><span class="pl-kos">;</span></td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/2639a984ce4e693e1b44df1715cd4be7/raw/566839a49a79c772d26f44778a4e9e879207ab79/fadd_fast_bench.rs" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/2639a984ce4e693e1b44df1715cd4be7#file-fadd_fast_bench-rs">
          fadd_fast_bench.rs
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>Even though my M1 macbook air is not a perfect benchmark machine, the results don&#8217;t leave much room for interpretation</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9bja!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9bja!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 424w, https://substackcdn.com/image/fetch/$s_!9bja!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 848w, https://substackcdn.com/image/fetch/$s_!9bja!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 1272w, https://substackcdn.com/image/fetch/$s_!9bja!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9bja!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png" width="1456" height="633" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:633,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:175485,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9bja!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 424w, https://substackcdn.com/image/fetch/$s_!9bja!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 848w, https://substackcdn.com/image/fetch/$s_!9bja!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 1272w, https://substackcdn.com/image/fetch/$s_!9bja!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbccdb57-3351-4cd2-9652-d6f1e4799e84_1628x708.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>We can get similar results in C/C++ by adding -ffast-math compiler flag, but it&#8217;s overly coarse grained and moves a very important decision from source code to build configuration.</p><p>So if you&#8217;re using Rust nightly, don&#8217;t mind using unstable features, accept that floating point arithmetic is not perfect and like performance, consider using one of the *_fast intrinsics.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Growing queues faster in go.]]></title><description><![CDATA[Or copy vs %.]]></description><link>https://softwarebits.substack.com/p/growing-queues-faster-in-go</link><guid isPermaLink="false">https://softwarebits.substack.com/p/growing-queues-faster-in-go</guid><dc:creator><![CDATA[Taras Tsugrii]]></dc:creator><pubDate>Sun, 06 Aug 2023 00:38:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!rMcp!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><strong>Dynamic data structures</strong> have a size that can change at runtime. This means that the data structure can grow or shrink as needed to accommodate the data that is being stored. They are often used when the size of the data set is not known in advance, such as in the case of a stack, queue etc.</p><p>Today we&#8217;re going to look at what happens with the queue in golang when newly <a href="https://github.com/golang/go/blob/master/src/internal/fuzz/queue.go#L27-L40">enqueued element no longer fits into existing storage slice</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/golang/go/blob/master/src/internal/fuzz/queue.go#L27-L40" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!rMcp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 424w, https://substackcdn.com/image/fetch/$s_!rMcp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 848w, https://substackcdn.com/image/fetch/$s_!rMcp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 1272w, https://substackcdn.com/image/fetch/$s_!rMcp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!rMcp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png" width="1112" height="894" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:894,&quot;width&quot;:1112,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:180296,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/golang/go/blob/master/src/internal/fuzz/queue.go#L27-L40&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!rMcp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 424w, https://substackcdn.com/image/fetch/$s_!rMcp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 848w, https://substackcdn.com/image/fetch/$s_!rMcp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 1272w, https://substackcdn.com/image/fetch/$s_!rMcp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00179346-e234-4567-a2c9-b5686a8ccc77_1112x894.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In particular note that since this queue implementation is using ring buffer under the hood, q.head points at the spot where queue &#8220;starts&#8221;. Because of this, when copying elements into newly allocated storage, % is used to recompute element indices for the new head 0.</p><p>It&#8217;s not a secret that % is relatively expensive, so I started to wonder about its impact on performance. Technically it&#8217;s not needed - we just need to copy the elements in range [q.head..len(q)) followed by [len(q)-q.head..q.head) into newly allocated storage.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://github.com/golang/go/pull/61166/files" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!a_hM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 424w, https://substackcdn.com/image/fetch/$s_!a_hM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 848w, https://substackcdn.com/image/fetch/$s_!a_hM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 1272w, https://substackcdn.com/image/fetch/$s_!a_hM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!a_hM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png" width="1098" height="602" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:602,&quot;width&quot;:1098,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111234,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://github.com/golang/go/pull/61166/files&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!a_hM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 424w, https://substackcdn.com/image/fetch/$s_!a_hM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 848w, https://substackcdn.com/image/fetch/$s_!a_hM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 1272w, https://substackcdn.com/image/fetch/$s_!a_hM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8f2b6bd7-7703-4114-8a8a-97098d53ddb4_1098x602.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> In my opinion it&#8217;s at least as readable and leverages built-in copy. But what about performance? To find out we&#8217;ll use</p><div class="github-gist" data-attrs="{&quot;innerHTML&quot;:&quot;<div id=\&quot;gist123340415\&quot; class=\&quot;gist\&quot;>\n    <div class=\&quot;gist-file\&quot; translate=\&quot;no\&quot;>\n      <div class=\&quot;gist-data\&quot;>\n        <div class=\&quot;js-gist-file-update-container js-task-list-container file-box\&quot;>\n  <div id=\&quot;file-queue_test-go\&quot; class=\&quot;file my-2\&quot;>\n    \n    <div itemprop=\&quot;text\&quot; class=\&quot;Box-body p-0 blob-wrapper data type-go  \&quot;>\n\n        \n<div class=\&quot;js-check-bidi js-blob-code-container blob-code-content\&quot;>\n\n  <template class=\&quot;js-file-alert-template\&quot;>\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash flash-warn flash-full d-flex flex-items-center\&quot;>\n  <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n    <span>\n      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.\n      <a href=\&quot;https://github.co/hiddenchars\&quot; target=\&quot;_blank\&quot;>Learn more about bidirectional Unicode characters</a>\n    </span>\n\n\n  <div data-view-component=\&quot;true\&quot; class=\&quot;flash-action\&quot;>        <a href=\&quot;{{ revealButtonHref }}\&quot; data-view-component=\&quot;true\&quot; class=\&quot;btn-sm btn\&quot;>    Show hidden characters\n</a>\n</div>\n</div></template>\n<template class=\&quot;js-line-alert-template\&quot;>\n  <span aria-label=\&quot;This line has hidden Unicode characters\&quot; data-view-component=\&quot;true\&quot; class=\&quot;line-alert tooltipped tooltipped-e\&quot;>\n    <svg aria-hidden=\&quot;true\&quot; height=\&quot;16\&quot; viewBox=\&quot;0 0 16 16\&quot; version=\&quot;1.1\&quot; width=\&quot;16\&quot; data-view-component=\&quot;true\&quot; class=\&quot;octicon octicon-alert\&quot;>\n    <path d=\&quot;M6.457 1.047c.659-1.234 2.427-1.234 3.086 0l6.082 11.378A1.75 1.75 0 0 1 14.082 15H1.918a1.75 1.75 0 0 1-1.543-2.575Zm1.763.707a.25.25 0 0 0-.44 0L1.698 13.132a.25.25 0 0 0 .22.368h12.164a.25.25 0 0 0 .22-.368Zm.53 3.996v2.5a.75.75 0 0 1-1.5 0v-2.5a.75.75 0 0 1 1.5 0ZM9 11a1 1 0 1 1-2 0 1 1 0 0 1 2 0Z\&quot;></path>\n</svg>\n</span></template>\n\n  <table data-hpc class=\&quot;highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file\&quot; data-tab-size=\&quot;8\&quot; data-paste-markdown-skip data-tagsearch-lang=\&quot;Go\&quot; data-tagsearch-path=\&quot;queue_test.go\&quot;>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L1\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;1\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC1\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>package</span> queue</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L2\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;2\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC2\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L3\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;3\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC3\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>import</span> (</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L4\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;4\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC4\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s>&amp;quot;reflect&amp;quot;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L5\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;5\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC5\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s>&amp;quot;testing&amp;quot;</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L6\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;6\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC6\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L7\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;7\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC7\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L8\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;8\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC8\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>copyUsingMod</span>(<span class=pl-s1>elems</span> []<span class=pl-smi>int</span>, <span class=pl-s1>head</span> <span class=pl-smi>int</span>) []<span class=pl-smi>int</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L9\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;9\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC9\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s1>oldLen</span> <span class=pl-c1>:=</span> <span class=pl-en>len</span>(<span class=pl-s1>elems</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L10\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;10\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC10\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s1>newElems</span> <span class=pl-c1>:=</span> <span class=pl-en>make</span>([]<span class=pl-smi>int</span>, <span class=pl-s1>oldLen</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L11\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;11\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC11\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>for</span> <span class=pl-s1>i</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>i</span> <span class=pl-c1>&amp;lt;</span> <span class=pl-s1>oldLen</span>; <span class=pl-s1>i</span><span class=pl-c1>++</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L12\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;12\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC12\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>newElems</span>[<span class=pl-s1>i</span>] <span class=pl-c1>=</span> <span class=pl-s1>elems</span>[(<span class=pl-s1>head</span><span class=pl-c1>+</span><span class=pl-s1>i</span>)<span class=pl-c1>%</span><span class=pl-s1>oldLen</span>]</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L13\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;13\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC13\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L14\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;14\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC14\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>return</span> <span class=pl-s1>newElems</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L15\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;15\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC15\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L16\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;16\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC16\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L17\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;17\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC17\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>copyUsingCopy</span>(<span class=pl-s1>elems</span> []<span class=pl-smi>int</span>, <span class=pl-s1>head</span> <span class=pl-smi>int</span>) []<span class=pl-smi>int</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L18\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;18\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC18\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s1>oldLen</span> <span class=pl-c1>:=</span> <span class=pl-en>len</span>(<span class=pl-s1>elems</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L19\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;19\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC19\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s1>newElems</span> <span class=pl-c1>:=</span> <span class=pl-en>make</span>([]<span class=pl-smi>int</span>, <span class=pl-s1>oldLen</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L20\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;20\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC20\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-en>copy</span>(<span class=pl-s1>newElems</span>, <span class=pl-s1>elems</span>[<span class=pl-s1>head</span>:])</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L21\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;21\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC21\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-s1>wrote</span> <span class=pl-c1>:=</span> <span class=pl-s1>oldLen</span> <span class=pl-c1>-</span> <span class=pl-s1>head</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L22\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;22\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC22\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-en>copy</span>(<span class=pl-s1>newElems</span>[<span class=pl-s1>wrote</span>:], <span class=pl-s1>elems</span>[:<span class=pl-s1>head</span>])</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L23\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;23\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC23\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>return</span> <span class=pl-s1>newElems</span></td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L24\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;24\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC24\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L25\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;25\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC25\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L26\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;26\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC26\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>TestModCopy</span>(<span class=pl-s1>t</span> <span class=pl-c1>*</span>testing.<span class=pl-smi>T</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L27\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;27\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC27\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingMod</span>([]<span class=pl-smi>int</span>{<span class=pl-c1>1</span>}, <span class=pl-c1>0</span>), []<span class=pl-smi>int</span>{<span class=pl-c1>1</span>}) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L28\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;28\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC28\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;1&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L29\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;29\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC29\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L30\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;30\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC30\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingMod</span>([]<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>}, <span class=pl-c1>0</span>), []<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>}) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L31\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;31\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC31\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;2&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L32\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;32\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC32\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L33\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;33\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC33\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingMod</span>([]<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>}, <span class=pl-c1>1</span>), []<span class=pl-smi>int</span>{<span class=pl-c1>2</span>, <span class=pl-c1>1</span>}) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L34\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;34\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC34\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;3&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L35\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;35\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC35\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L36\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;36\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC36\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L37\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;37\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC37\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L38\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;38\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC38\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>TestCopyCopy</span>(<span class=pl-s1>t</span> <span class=pl-c1>*</span>testing.<span class=pl-smi>T</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L39\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;39\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC39\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingCopy</span>([]<span class=pl-smi>int</span>{<span class=pl-c1>1</span>}, <span class=pl-c1>0</span>), []<span class=pl-smi>int</span>{<span class=pl-c1>1</span>}) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L40\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;40\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC40\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;1&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L41\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;41\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC41\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L42\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;42\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC42\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingCopy</span>([]<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>}, <span class=pl-c1>0</span>), []<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>}) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L43\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;43\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC43\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;2&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L44\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;44\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC44\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L45\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;45\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC45\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingCopy</span>([]<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>}, <span class=pl-c1>1</span>), []<span class=pl-smi>int</span>{<span class=pl-c1>2</span>, <span class=pl-c1>1</span>}) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L46\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;46\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC46\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;3&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L47\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;47\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC47\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L48\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;48\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC48\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L49\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;49\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC49\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L50\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;50\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC50\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>var</span> <span class=pl-s1>elems</span> <span class=pl-c1>=</span> []<span class=pl-smi>int</span>{<span class=pl-c1>1</span>, <span class=pl-c1>2</span>, <span class=pl-c1>3</span>, <span class=pl-c1>4</span>, <span class=pl-c1>5</span>, <span class=pl-c1>6</span>, <span class=pl-c1>7</span>, <span class=pl-c1>8</span>, <span class=pl-c1>9</span>, <span class=pl-c1>10</span>, <span class=pl-c1>11</span>, <span class=pl-c1>12</span>, <span class=pl-c1>13</span>, <span class=pl-c1>14</span>, <span class=pl-c1>15</span>, <span class=pl-c1>16</span>, <span class=pl-c1>17</span>, <span class=pl-c1>18</span>, <span class=pl-c1>19</span>, <span class=pl-c1>20</span>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L51\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;51\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC51\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L52\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;52\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC52\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>TestModel</span>(<span class=pl-s1>t</span> <span class=pl-c1>*</span>testing.<span class=pl-smi>T</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L53\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;53\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC53\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>for</span> <span class=pl-s1>h</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>h</span> <span class=pl-c1>&amp;lt;</span> <span class=pl-en>len</span>(<span class=pl-s1>elems</span>); <span class=pl-s1>h</span><span class=pl-c1>++</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L54\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;54\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC54\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-k>if</span> <span class=pl-c1>!</span><span class=pl-s1>reflect</span>.<span class=pl-en>DeepEqual</span>(<span class=pl-en>copyUsingMod</span>(<span class=pl-s1>elems</span>, <span class=pl-s1>h</span>), <span class=pl-en>copyUsingCopy</span>(<span class=pl-s1>elems</span>, <span class=pl-s1>h</span>)) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L55\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;55\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC55\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t\t<span class=pl-s1>t</span>.<span class=pl-en>Error</span>(<span class=pl-s>&amp;quot;model&amp;quot;</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L56\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;56\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC56\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L57\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;57\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC57\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L58\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;58\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC58\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L59\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;59\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC59\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L60\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;60\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC60\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>BenchmarkModClone</span>(<span class=pl-s1>b</span> <span class=pl-c1>*</span>testing.<span class=pl-smi>B</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L61\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;61\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC61\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>for</span> <span class=pl-s1>i</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>i</span> <span class=pl-c1>&amp;lt;</span> <span class=pl-s1>b</span>.<span class=pl-c1>N</span>; <span class=pl-s1>i</span><span class=pl-c1>++</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L62\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;62\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC62\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-k>for</span> <span class=pl-s1>h</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>h</span> <span class=pl-c1>&amp;lt;</span> <span class=pl-en>len</span>(<span class=pl-s1>elems</span>); <span class=pl-s1>h</span><span class=pl-c1>++</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L63\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;63\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC63\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t\t<span class=pl-en>copyUsingMod</span>(<span class=pl-s1>elems</span>, <span class=pl-s1>h</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L64\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;64\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC64\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L65\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;65\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC65\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L66\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;66\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC66\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L67\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;67\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC67\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\n</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L68\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;68\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC68\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;><span class=pl-k>func</span> <span class=pl-en>BenchmarkCopyClone</span>(<span class=pl-s1>b</span> <span class=pl-c1>*</span>testing.<span class=pl-smi>B</span>) {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L69\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;69\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC69\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t<span class=pl-k>for</span> <span class=pl-s1>i</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>i</span> <span class=pl-c1>&amp;lt;</span> <span class=pl-s1>b</span>.<span class=pl-c1>N</span>; <span class=pl-s1>i</span><span class=pl-c1>++</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L70\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;70\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC70\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t<span class=pl-k>for</span> <span class=pl-s1>h</span> <span class=pl-c1>:=</span> <span class=pl-c1>0</span>; <span class=pl-s1>h</span> <span class=pl-c1>&amp;lt;</span> <span class=pl-en>len</span>(<span class=pl-s1>elems</span>); <span class=pl-s1>h</span><span class=pl-c1>++</span> {</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L71\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;71\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC71\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t\t<span class=pl-en>copyUsingCopy</span>(<span class=pl-s1>elems</span>, <span class=pl-s1>h</span>)</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L72\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;72\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC72\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L73\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;73\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC73\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>\t}</td>\n        </tr>\n        <tr>\n          <td id=\&quot;file-queue_test-go-L74\&quot; class=\&quot;blob-num js-line-number js-code-nav-line-number js-blob-rnum\&quot; data-line-number=\&quot;74\&quot;></td>\n          <td id=\&quot;file-queue_test-go-LC74\&quot; class=\&quot;blob-code blob-code-inner js-file-line\&quot;>}</td>\n        </tr>\n  </table>\n</div>\n\n\n    </div>\n\n  </div>\n</div>\n\n      </div>\n      <div class=\&quot;gist-meta\&quot;>\n        <a href=\&quot;https://gist.github.com/ttsugriy/45db22b2564745bedda05574c033c0b0/raw/2234350e599027184b9f0165aadd685bcdb4f0be/queue_test.go\&quot; style=\&quot;float:right\&quot;>view raw</a>\n        <a href=\&quot;https://gist.github.com/ttsugriy/45db22b2564745bedda05574c033c0b0#file-queue_test-go\&quot;>\n          queue_test.go\n        </a>\n        hosted with &amp;#10084; by <a href=\&quot;https://github.com\&quot;>GitHub</a>\n      </div>\n    </div>\n</div>\n&quot;,&quot;stylesheet&quot;:&quot;https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css&quot;}" data-component-name="GitgistToDOM"><link rel="stylesheet" href="https://github.githubassets.com/assets/gist-embed-8454a1c20ec2.css"><div id="gist123340415" class="gist">
    <div class="gist-file">
      <div class="gist-data">
        <div class="js-gist-file-update-container js-task-list-container file-box">
  <div id="file-queue_test-go" class="file my-2">
    
    <div itemprop="text" class="Box-body p-0 blob-wrapper data type-go  ">

        
<div class="js-check-bidi js-blob-code-container blob-code-content">

  
  <div data-view-component="true" class="flash flash-warn flash-full d-flex flex-items-center">
  
    

    <span>
      This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      <a href="https://github.co/hiddenchars" target="_blank">Learn more about bidirectional Unicode characters</a>
    </span>


  <div data-view-component="true" class="flash-action">        <a href="{{ revealButtonHref }}" data-view-component="true" class="btn-sm btn">    Show hidden characters
</a>
</div>
</div>

  <span data-view-component="true" class="line-alert tooltipped tooltipped-e">
    
    

</span>

  <table data-hpc="" class="highlight tab-size js-file-line-container js-code-nav-container js-tagsearch-file" data-tab-size="8" data-paste-markdown-skip="" data-tagsearch-lang="Go" data-tagsearch-path="queue_test.go">
        <tbody><tr>
          <td id="file-queue_test-go-L1" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="1"></td>
          <td id="file-queue_test-go-LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-k">package</span> queue</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L2" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="2"></td>
          <td id="file-queue_test-go-LC2" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L3" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="3"></td>
          <td id="file-queue_test-go-LC3" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> (</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L4" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="4"></td>
          <td id="file-queue_test-go-LC4" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s">"reflect"</span></td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L5" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="5"></td>
          <td id="file-queue_test-go-LC5" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s">"testing"</span></td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L6" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="6"></td>
          <td id="file-queue_test-go-LC6" class="blob-code blob-code-inner js-file-line">)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L7" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="7"></td>
          <td id="file-queue_test-go-LC7" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L8" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="8"></td>
          <td id="file-queue_test-go-LC8" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">copyUsingMod</span>(<span class="pl-s1">elems</span> []<span class="pl-smi">int</span>, <span class="pl-s1">head</span> <span class="pl-smi">int</span>) []<span class="pl-smi">int</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L9" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="9"></td>
          <td id="file-queue_test-go-LC9" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s1">oldLen</span> <span class="pl-c1">:=</span> <span class="pl-en">len</span>(<span class="pl-s1">elems</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L10" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="10"></td>
          <td id="file-queue_test-go-LC10" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s1">newElems</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">int</span>, <span class="pl-s1">oldLen</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L11" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="11"></td>
          <td id="file-queue_test-go-LC11" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">oldLen</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L12" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="12"></td>
          <td id="file-queue_test-go-LC12" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">newElems</span>[<span class="pl-s1">i</span>] <span class="pl-c1">=</span> <span class="pl-s1">elems</span>[(<span class="pl-s1">head</span><span class="pl-c1">+</span><span class="pl-s1">i</span>)<span class="pl-c1">%</span><span class="pl-s1">oldLen</span>]</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L13" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="13"></td>
          <td id="file-queue_test-go-LC13" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L14" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="14"></td>
          <td id="file-queue_test-go-LC14" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">return</span> <span class="pl-s1">newElems</span></td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L15" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="15"></td>
          <td id="file-queue_test-go-LC15" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L16" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="16"></td>
          <td id="file-queue_test-go-LC16" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L17" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="17"></td>
          <td id="file-queue_test-go-LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">copyUsingCopy</span>(<span class="pl-s1">elems</span> []<span class="pl-smi">int</span>, <span class="pl-s1">head</span> <span class="pl-smi">int</span>) []<span class="pl-smi">int</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L18" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="18"></td>
          <td id="file-queue_test-go-LC18" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s1">oldLen</span> <span class="pl-c1">:=</span> <span class="pl-en">len</span>(<span class="pl-s1">elems</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L19" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="19"></td>
          <td id="file-queue_test-go-LC19" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s1">newElems</span> <span class="pl-c1">:=</span> <span class="pl-en">make</span>([]<span class="pl-smi">int</span>, <span class="pl-s1">oldLen</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L20" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="20"></td>
          <td id="file-queue_test-go-LC20" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-en">copy</span>(<span class="pl-s1">newElems</span>, <span class="pl-s1">elems</span>[<span class="pl-s1">head</span>:])</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L21" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="21"></td>
          <td id="file-queue_test-go-LC21" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-s1">wrote</span> <span class="pl-c1">:=</span> <span class="pl-s1">oldLen</span> <span class="pl-c1">-</span> <span class="pl-s1">head</span></td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L22" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="22"></td>
          <td id="file-queue_test-go-LC22" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-en">copy</span>(<span class="pl-s1">newElems</span>[<span class="pl-s1">wrote</span>:], <span class="pl-s1">elems</span>[:<span class="pl-s1">head</span>])</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L23" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="23"></td>
          <td id="file-queue_test-go-LC23" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">return</span> <span class="pl-s1">newElems</span></td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L24" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="24"></td>
          <td id="file-queue_test-go-LC24" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L25" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="25"></td>
          <td id="file-queue_test-go-LC25" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L26" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="26"></td>
          <td id="file-queue_test-go-LC26" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">TestModCopy</span>(<span class="pl-s1">t</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">T</span>) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L27" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="27"></td>
          <td id="file-queue_test-go-LC27" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingMod</span>([]<span class="pl-smi">int</span>{<span class="pl-c1">1</span>}, <span class="pl-c1">0</span>), []<span class="pl-smi">int</span>{<span class="pl-c1">1</span>}) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L28" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="28"></td>
          <td id="file-queue_test-go-LC28" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"1"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L29" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="29"></td>
          <td id="file-queue_test-go-LC29" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L30" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="30"></td>
          <td id="file-queue_test-go-LC30" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingMod</span>([]<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}, <span class="pl-c1">0</span>), []<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L31" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="31"></td>
          <td id="file-queue_test-go-LC31" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"2"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L32" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="32"></td>
          <td id="file-queue_test-go-LC32" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L33" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="33"></td>
          <td id="file-queue_test-go-LC33" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingMod</span>([]<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}, <span class="pl-c1">1</span>), []<span class="pl-smi">int</span>{<span class="pl-c1">2</span>, <span class="pl-c1">1</span>}) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L34" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="34"></td>
          <td id="file-queue_test-go-LC34" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"3"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L35" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="35"></td>
          <td id="file-queue_test-go-LC35" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L36" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="36"></td>
          <td id="file-queue_test-go-LC36" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L37" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="37"></td>
          <td id="file-queue_test-go-LC37" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L38" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="38"></td>
          <td id="file-queue_test-go-LC38" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">TestCopyCopy</span>(<span class="pl-s1">t</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">T</span>) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L39" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="39"></td>
          <td id="file-queue_test-go-LC39" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingCopy</span>([]<span class="pl-smi">int</span>{<span class="pl-c1">1</span>}, <span class="pl-c1">0</span>), []<span class="pl-smi">int</span>{<span class="pl-c1">1</span>}) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L40" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="40"></td>
          <td id="file-queue_test-go-LC40" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"1"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L41" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="41"></td>
          <td id="file-queue_test-go-LC41" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L42" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="42"></td>
          <td id="file-queue_test-go-LC42" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingCopy</span>([]<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}, <span class="pl-c1">0</span>), []<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L43" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="43"></td>
          <td id="file-queue_test-go-LC43" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"2"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L44" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="44"></td>
          <td id="file-queue_test-go-LC44" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L45" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="45"></td>
          <td id="file-queue_test-go-LC45" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingCopy</span>([]<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>}, <span class="pl-c1">1</span>), []<span class="pl-smi">int</span>{<span class="pl-c1">2</span>, <span class="pl-c1">1</span>}) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L46" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="46"></td>
          <td id="file-queue_test-go-LC46" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"3"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L47" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="47"></td>
          <td id="file-queue_test-go-LC47" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L48" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="48"></td>
          <td id="file-queue_test-go-LC48" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L49" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="49"></td>
          <td id="file-queue_test-go-LC49" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L50" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="50"></td>
          <td id="file-queue_test-go-LC50" class="blob-code blob-code-inner js-file-line"><span class="pl-k">var</span> <span class="pl-s1">elems</span> <span class="pl-c1">=</span> []<span class="pl-smi">int</span>{<span class="pl-c1">1</span>, <span class="pl-c1">2</span>, <span class="pl-c1">3</span>, <span class="pl-c1">4</span>, <span class="pl-c1">5</span>, <span class="pl-c1">6</span>, <span class="pl-c1">7</span>, <span class="pl-c1">8</span>, <span class="pl-c1">9</span>, <span class="pl-c1">10</span>, <span class="pl-c1">11</span>, <span class="pl-c1">12</span>, <span class="pl-c1">13</span>, <span class="pl-c1">14</span>, <span class="pl-c1">15</span>, <span class="pl-c1">16</span>, <span class="pl-c1">17</span>, <span class="pl-c1">18</span>, <span class="pl-c1">19</span>, <span class="pl-c1">20</span>}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L51" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="51"></td>
          <td id="file-queue_test-go-LC51" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L52" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="52"></td>
          <td id="file-queue_test-go-LC52" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">TestModel</span>(<span class="pl-s1">t</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">T</span>) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L53" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="53"></td>
          <td id="file-queue_test-go-LC53" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">for</span> <span class="pl-s1">h</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">h</span> <span class="pl-c1">&lt;</span> <span class="pl-en">len</span>(<span class="pl-s1">elems</span>); <span class="pl-s1">h</span><span class="pl-c1">++</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L54" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="54"></td>
          <td id="file-queue_test-go-LC54" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-k">if</span> <span class="pl-c1">!</span><span class="pl-s1">reflect</span>.<span class="pl-en">DeepEqual</span>(<span class="pl-en">copyUsingMod</span>(<span class="pl-s1">elems</span>, <span class="pl-s1">h</span>), <span class="pl-en">copyUsingCopy</span>(<span class="pl-s1">elems</span>, <span class="pl-s1">h</span>)) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L55" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="55"></td>
          <td id="file-queue_test-go-LC55" class="blob-code blob-code-inner js-file-line">&#9;&#9;&#9;<span class="pl-s1">t</span>.<span class="pl-en">Error</span>(<span class="pl-s">"model"</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L56" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="56"></td>
          <td id="file-queue_test-go-LC56" class="blob-code blob-code-inner js-file-line">&#9;&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L57" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="57"></td>
          <td id="file-queue_test-go-LC57" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L58" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="58"></td>
          <td id="file-queue_test-go-LC58" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L59" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="59"></td>
          <td id="file-queue_test-go-LC59" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L60" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="60"></td>
          <td id="file-queue_test-go-LC60" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">BenchmarkModClone</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L61" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="61"></td>
          <td id="file-queue_test-go-LC61" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">b</span>.<span class="pl-c1">N</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L62" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="62"></td>
          <td id="file-queue_test-go-LC62" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-k">for</span> <span class="pl-s1">h</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">h</span> <span class="pl-c1">&lt;</span> <span class="pl-en">len</span>(<span class="pl-s1">elems</span>); <span class="pl-s1">h</span><span class="pl-c1">++</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L63" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="63"></td>
          <td id="file-queue_test-go-LC63" class="blob-code blob-code-inner js-file-line">&#9;&#9;&#9;<span class="pl-en">copyUsingMod</span>(<span class="pl-s1">elems</span>, <span class="pl-s1">h</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L64" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="64"></td>
          <td id="file-queue_test-go-LC64" class="blob-code blob-code-inner js-file-line">&#9;&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L65" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="65"></td>
          <td id="file-queue_test-go-LC65" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L66" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="66"></td>
          <td id="file-queue_test-go-LC66" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L67" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="67"></td>
          <td id="file-queue_test-go-LC67" class="blob-code blob-code-inner js-file-line">
</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L68" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="68"></td>
          <td id="file-queue_test-go-LC68" class="blob-code blob-code-inner js-file-line"><span class="pl-k">func</span> <span class="pl-en">BenchmarkCopyClone</span>(<span class="pl-s1">b</span> <span class="pl-c1">*</span>testing.<span class="pl-smi">B</span>) {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L69" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="69"></td>
          <td id="file-queue_test-go-LC69" class="blob-code blob-code-inner js-file-line">&#9;<span class="pl-k">for</span> <span class="pl-s1">i</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">i</span> <span class="pl-c1">&lt;</span> <span class="pl-s1">b</span>.<span class="pl-c1">N</span>; <span class="pl-s1">i</span><span class="pl-c1">++</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L70" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="70"></td>
          <td id="file-queue_test-go-LC70" class="blob-code blob-code-inner js-file-line">&#9;&#9;<span class="pl-k">for</span> <span class="pl-s1">h</span> <span class="pl-c1">:=</span> <span class="pl-c1">0</span>; <span class="pl-s1">h</span> <span class="pl-c1">&lt;</span> <span class="pl-en">len</span>(<span class="pl-s1">elems</span>); <span class="pl-s1">h</span><span class="pl-c1">++</span> {</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L71" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="71"></td>
          <td id="file-queue_test-go-LC71" class="blob-code blob-code-inner js-file-line">&#9;&#9;&#9;<span class="pl-en">copyUsingCopy</span>(<span class="pl-s1">elems</span>, <span class="pl-s1">h</span>)</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L72" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="72"></td>
          <td id="file-queue_test-go-LC72" class="blob-code blob-code-inner js-file-line">&#9;&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L73" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="73"></td>
          <td id="file-queue_test-go-LC73" class="blob-code blob-code-inner js-file-line">&#9;}</td>
        </tr>
        <tr>
          <td id="file-queue_test-go-L74" class="blob-num js-line-number js-code-nav-line-number js-blob-rnum" data-line-number="74"></td>
          <td id="file-queue_test-go-LC74" class="blob-code blob-code-inner js-file-line">}</td>
        </tr>
  </tbody></table>
</div>


    </div>

  </div>
</div>

      </div>
      <div class="gist-meta">
        <a href="https://gist.github.com/ttsugriy/45db22b2564745bedda05574c033c0b0/raw/2234350e599027184b9f0165aadd685bcdb4f0be/queue_test.go" style="float:right">view raw</a>
        <a href="https://gist.github.com/ttsugriy/45db22b2564745bedda05574c033c0b0#file-queue_test-go">
          queue_test.go
        </a>
        hosted with &#10084; by <a href="https://github.com">GitHub</a>
      </div>
    </div>
</div>
</div><p>To focus on the topic of our discussion, it exercises only the copying part. And the results are</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CPKs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CPKs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 424w, https://substackcdn.com/image/fetch/$s_!CPKs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 848w, https://substackcdn.com/image/fetch/$s_!CPKs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 1272w, https://substackcdn.com/image/fetch/$s_!CPKs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CPKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png" width="1456" height="499" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:499,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190660,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CPKs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 424w, https://substackcdn.com/image/fetch/$s_!CPKs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 848w, https://substackcdn.com/image/fetch/$s_!CPKs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 1272w, https://substackcdn.com/image/fetch/$s_!CPKs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1696fe43-31fe-4241-84a9-c9908195741f_1956x670.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Not bad for such a small slice, since total cost is dominated by the memory allocation cost.</p><p>This change is part of the <a href="https://github.com/golang/go/pull/61166">golang PR</a> and hopefully will make golang repo a bit better.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://softwarebits.substack.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Software Bits Newsletter! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item></channel></rss>