Skip to content
Snippets Groups Projects
  1. Dec 16, 2017
  2. Dec 13, 2017
    • Carl Lerche's avatar
      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.
      Unverified
      02891144
  3. Aug 18, 2017
    • Dan Burkert's avatar
      small fixups in bytes.rs (#145) · 03d501b1
      Dan Burkert authored
      * Inner: make uninitialized construction explicit
      * Remove Inner2
      * Remove unnecessary transmutes
      * Use AtomicPtr::get_mut where possible
      * Some minor tweaks
      03d501b1
  4. Aug 17, 2017
  5. Aug 06, 2017
  6. Jul 02, 2017
  7. Jul 01, 2017
  8. Jun 27, 2017
  9. Jun 15, 2017
  10. May 26, 2017
  11. May 24, 2017
  12. May 22, 2017
    • Stepan Koltsov's avatar
      Optimize Bytes::slice(n, n) (#123) · 3f5890be
      Stepan Koltsov authored
      Return empty `Bytes` object
      
      Bench for `slice_empty` difference is
      
      ```
      55 ns/iter (+/- 1) # before this patch
      17 ns/iter (+/- 5) # with this patch
      ```
      
      Bench for `slice_not_empty` is
      
      ```
      25,058 ns/iter (+/- 1,099) # before this patch
      25,072 ns/iter (+/- 1,593) # with this patch
      ```
      3f5890be
    • Stepan Koltsov's avatar
      Minor doc fixes (#124) · edf1af95
      Stepan Koltsov authored
      edf1af95
  13. May 15, 2017
    • Stepan Koltsov's avatar
      BytesMut::reserve should not overallocate (#117) · 7110d57b
      Stepan Koltsov authored
      Round up to power of 2 is not necessary, because `reserve` already
      doubles previous capacity in
      
      ```
      	new_cap = cmp::max(
      		cmp::max(v.capacity() << 1, new_cap),
      		original_capacity);
      ```
      
      which makes `reserve` calls constant in average. Avoiding rounding
      up prevents `reserve` from wasting space when caller knows exactly
      what space they need.
      
      Patch adds three tests which would fail before this test. The most
      important is this:
      
      ```
      #[test]
      fn reserve_in_arc_unique_does_not_overallocate() {
          let mut bytes = BytesMut::with_capacity(1000);
          bytes.take();
      
          // now bytes is Arc and refcount == 1
      
          assert_eq!(1000, bytes.capacity());
          bytes.reserve(2001);
          assert_eq!(2001, bytes.capacity());
      }
      ```
      
      It asserts that when user requests more than double of current
      capacity, exactly the requested amount of memory is allocated and
      is not wasted to next power of two.
      7110d57b
    • Stepan Koltsov's avatar
      Bytes::extend_from_slice (#120) · 07db74b0
      Stepan Koltsov authored
      `extend_with_slice` is super-convenient operation on `Bytes`.
      
      While `put_u8` would be expensive on `Bytes`, `extend_from_slice`
      is OK, because it is batch, and it checks for kind only once.
      
      Patch also adds `impl Extend for Bytes`.
      
      cc #116
      07db74b0
  14. May 02, 2017
  15. May 01, 2017
  16. Apr 30, 2017
  17. Apr 24, 2017
  18. Apr 14, 2017
  19. Apr 06, 2017
  20. Mar 30, 2017
    • Carl Lerche's avatar
      Bytes: only the vec repr is not shared (#100) · 9aa24ebe
      Carl Lerche authored
      The shared debug_assert is to ensure that the internal Bytes
      representation is such that offset views are supported. The only
      representation that does not support offset views is vec.
      
      Fixes #97
      9aa24ebe
  21. Mar 28, 2017
    • Stepan Koltsov's avatar
    • Stepan Koltsov's avatar
      Handle corner cases of Bytes::split_{off,to} (#87) · b78bb3ba
      Stepan Koltsov authored
      Before this commit `Bytes::split_{off,to}` always created a shallow copy if `self` is arc or vec.
      
      However, in certain cases `split_off` or `split_to` is called with `len` or `0` parameter. E. g. if you are reading a frame from buffered stream, it is likely that buffer contains exactly the frame size bytes, so `split_to` will be called with `len` param.
      
      Although, `split_off` and `split_to` functions are `O(1)`, shallow copy have downsides:
      
      * shallow copy on vector does malloc and atomic cmpxchg
      * after shallow copy, following operations (e. g. `drop`) on both `bytes` objects require atomics
      * memory will be probably released to the system later
      * `try_mut` will fail
      * [into_vec](https://github.com/carllerche/bytes/issues/86) will copy
      b78bb3ba
  22. Mar 24, 2017
  23. Mar 21, 2017
    • Stepan Koltsov's avatar
      Reimplement fmt::Debug for Bytes and BytesMut (#84) · 613d4bd5
      Stepan Koltsov authored
      Standard `Debug` implementation for `[u8]` is comma separated list
      of numbers. Since large amount of byte strings are in fact ASCII
      strings or contain a lot of ASCII strings (e. g. HTTP), it is
      convenient to print strings as ASCII when possible.
      613d4bd5
  24. Mar 19, 2017
    • Carl Lerche's avatar
      Clarify when `BufMut::bytes_mut` can return &[] · bed128b2
      Carl Lerche authored
      Closes #79
      bed128b2
    • Dan Burkert's avatar
      Add inline attributes to Vec's MutBuf methods (#80) · 5a265cc8
      Dan Burkert authored
      I found this significantly improved a
      [benchmark](https://gist.github.com/danburkert/34a7d6680d97bc86dca7f396eb8d0abf)
      which calls `bytes_mut`, writes 1 byte, and advances the pointer with
      `advance_mut` in a pretty tight loop. In particular, it seems to be the
      inline annotation on `bytes_mut` which had the most effect. I also took
      the opportunity to simplify the bounds checking in advance_mut.
      
      before:
      
      ```
      test encode_varint_small  ... bench:         540 ns/iter (+/- 85) = 1481 MB/s
      ```
      
      after:
      
      ```
      test encode_varint_small  ... bench:         422 ns/iter (+/- 24) = 1895 MB/s
      ```
      
      As you can see, the variance is also significantly improved.
      
      Interestingly, I tried to change the last statement in `bytes_mut` from
      
      ```
      &mut slice::from_raw_parts_mut(ptr, cap)[len..]
      ```
      
      to
      
      ```
      slice::from_raw_parts_mut(ptr.offset(len as isize), cap - len)
      ```
      
      but, this caused a very measurable perf regression (almost completely
      negating the gains from marking bytes_mut inline).
      5a265cc8
    • Dan Burkert's avatar
      Clarify BufMut::advance_mut docs (#78) · 4fe4e942
      Dan Burkert authored
      Also fixes an issue with a line wrap in the middle of an inline code
      block.
      4fe4e942
  25. Mar 16, 2017
  26. Mar 07, 2017
Loading