Skip to content
Snippets Groups Projects
  • Carl Lerche's avatar
    02891144
    Add `advance` on `Bytes` and `BytesMut` (#166) · 02891144
    Carl Lerche authored
    * Compact Bytes original capacity representation
    
    In order to avoid unnecessary allocations, a `Bytes` structure remembers
    the capacity with which it was first created. When a reserve operation
    is issued, this original capacity value is used to as a baseline for
    reallocating new storage.
    
    Previously, this original capacity value was stored in its raw form. In
    other words, the original capacity `usize` was stored as is. In order to
    reclaim some `Bytes` internal storage space for additional features,
    this original capacity value is compressed from requiring 16 bits to 3.
    
    To do this, instead of storing the exact original capacity. The original
    capacity is rounded down to the nearest power of two. If the original
    capacity is less than 1024, then it is rounded down to zero. This
    roughly means that the original capacity is now stored as a table:
    
    0 => 0
    1 => 1k
    2 => 2k
    3 => 4k
    4 => 8k
    5 => 16k
    6 => 32k
    7 => 64k
    
    For the purposes that the original capacity feature was introduced, this
    is sufficient granularity.
    
    * Provide `advance` on Bytes and BytesMut
    
    This is the `advance` function that would be part of a `Buf`
    implementation. However, `Bytes` and `BytesMut` cannot impl `Buf` until
    the next breaking release.
    
    The implementation uses the additional storage made available by the
    previous commit to store the number of bytes that the view was advanced.
    The `ptr` pointer will point to the start of the window, avoiding any
    pointer arithmetic when dereferencing the `Bytes` handle.
    Add `advance` on `Bytes` and `BytesMut` (#166)
    Carl Lerche authored
    * Compact Bytes original capacity representation
    
    In order to avoid unnecessary allocations, a `Bytes` structure remembers
    the capacity with which it was first created. When a reserve operation
    is issued, this original capacity value is used to as a baseline for
    reallocating new storage.
    
    Previously, this original capacity value was stored in its raw form. In
    other words, the original capacity `usize` was stored as is. In order to
    reclaim some `Bytes` internal storage space for additional features,
    this original capacity value is compressed from requiring 16 bits to 3.
    
    To do this, instead of storing the exact original capacity. The original
    capacity is rounded down to the nearest power of two. If the original
    capacity is less than 1024, then it is rounded down to zero. This
    roughly means that the original capacity is now stored as a table:
    
    0 => 0
    1 => 1k
    2 => 2k
    3 => 4k
    4 => 8k
    5 => 16k
    6 => 32k
    7 => 64k
    
    For the purposes that the original capacity feature was introduced, this
    is sufficient granularity.
    
    * Provide `advance` on Bytes and BytesMut
    
    This is the `advance` function that would be part of a `Buf`
    implementation. However, `Bytes` and `BytesMut` cannot impl `Buf` until
    the next breaking release.
    
    The implementation uses the additional storage made available by the
    previous commit to store the number of bytes that the view was advanced.
    The `ptr` pointer will point to the start of the window, avoiding any
    pointer arithmetic when dereferencing the `Bytes` handle.
test_bytes.rs 12.33 KiB