Skip to content
Snippets Groups Projects
  1. Jun 15, 2017
  2. May 26, 2017
  3. May 24, 2017
  4. May 22, 2017
  5. 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
  6. May 02, 2017
  7. May 01, 2017
  8. Apr 30, 2017
  9. Apr 26, 2017
  10. Apr 24, 2017
  11. Apr 14, 2017
  12. Apr 06, 2017
  13. Apr 05, 2017
  14. 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
  15. 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
  16. Mar 24, 2017
  17. 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
  18. Mar 20, 2017
    • Carl Lerche's avatar
      Misc CI fixes (#89) · dc9c8e30
      Carl Lerche authored
      Limit the number of threads when using qemu to 1. Also, don't bother
      running the stress test as this will trigger qemu bugs. Finally, also
      make the stress test actually stress test.
      dc9c8e30
  19. 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
    • Carl Lerche's avatar
      Fix tests on nightly · 9a4018e7
      Carl Lerche authored
      Closes #83
      9a4018e7
  20. Mar 16, 2017
  21. Mar 15, 2017
  22. Mar 07, 2017
  23. Mar 03, 2017
    • Carl Lerche's avatar
      `BytesMut::reserve` should avoid small allocations · 933b8b26
      Carl Lerche authored
      This change tracks the original capacity requested when `BytesMut` is
      first created. This capacity is used when a `reserve` needs to allocate
      due to the current view being too small. The newly allocated buffer will
      be sized the same as the original allocation.
      933b8b26
  24. Mar 02, 2017
Loading