diff options
author | 2019-11-12 14:52:02 -0800 | |
---|---|---|
committer | 2019-11-12 14:52:02 -0800 | |
commit | b32f6298e289958986b68982788562f3c097f8fc (patch) | |
tree | c838443425e327474eb79565bf94bbeaad7411a9 | |
parent | 856ed7c43de8eca457cc5e00b7fdcc3edeb4c52a (diff) | |
download | bytes-b32f6298e289958986b68982788562f3c097f8fc.tar.gz bytes-b32f6298e289958986b68982788562f3c097f8fc.tar.zst bytes-b32f6298e289958986b68982788562f3c097f8fc.zip |
Improve performance of `BytesMut::reserve` (#313)
Makes the short-circuit checks inline-able, and the moves the actual
reserving code to an inner function.
-rw-r--r-- | benches/bytes_mut.rs | 21 | ||||
-rw-r--r-- | src/bytes_mut.rs | 9 |
2 files changed, 27 insertions, 3 deletions
diff --git a/benches/bytes_mut.rs b/benches/bytes_mut.rs index 8e49f9c..ded1d14 100644 --- a/benches/bytes_mut.rs +++ b/benches/bytes_mut.rs @@ -141,10 +141,25 @@ fn fmt_write(b: &mut Bencher) { }) } +#[bench] +fn bytes_mut_extend(b: &mut Bencher) { + let mut buf = BytesMut::with_capacity(256); + let data = [33u8; 32]; + + b.bytes = data.len() as u64 * 4; + b.iter(|| { + for _ in 0..4 { + buf.extend(&data); + } + test::black_box(&buf); + unsafe { buf.set_len(0); } + }); +} + // BufMut for BytesMut vs Vec<u8> #[bench] -fn put_bytes_mut(b: &mut Bencher) { +fn put_slice_bytes_mut(b: &mut Bencher) { let mut buf = BytesMut::with_capacity(256); let data = [33u8; 32]; @@ -174,7 +189,7 @@ fn put_u8_bytes_mut(b: &mut Bencher) { } #[bench] -fn put_vec(b: &mut Bencher) { +fn put_slice_vec(b: &mut Bencher) { let mut buf = Vec::<u8>::with_capacity(256); let data = [33u8; 32]; @@ -204,7 +219,7 @@ fn put_u8_vec(b: &mut Bencher) { } #[bench] -fn put_vec_extend(b: &mut Bencher) { +fn put_slice_vec_extend(b: &mut Bencher) { let mut buf = Vec::<u8>::with_capacity(256); let data = [33u8; 32]; diff --git a/src/bytes_mut.rs b/src/bytes_mut.rs index 8895602..bc8cc05 100644 --- a/src/bytes_mut.rs +++ b/src/bytes_mut.rs @@ -513,6 +513,7 @@ impl BytesMut { /// # Panics /// /// Panics if the new capacity overflows `usize`. + #[inline] pub fn reserve(&mut self, additional: usize) { let len = self.len(); let rem = self.capacity() - len; @@ -523,6 +524,13 @@ impl BytesMut { return; } + self.reserve_inner(additional); + } + + // In separate function to allow the short-circuits in `reserve` to + // be inline-able. Significant helps performance. + fn reserve_inner(&mut self, additional: usize) { + let len = self.len(); let kind = self.kind(); if kind == KIND_VEC { @@ -637,6 +645,7 @@ impl BytesMut { // Forget the vector handle mem::forget(v); + } /// Appends given bytes to this object. /// |