From 8553b4f18fd07112488ffee5d60132389a4340ff Mon Sep 17 00:00:00 2001 From: Dan Burkert Date: Mon, 9 Nov 2020 00:11:50 -0800 Subject: [PATCH 1/3] Simplify as BufMut>::bytes_mut() Removes a call to UninitMut indexing, which can panic, from `Vec::::bytes_mut()`. I came across this while looking at a performance issue encountered after moving to bytes 0.6. This change makes a microbenchmark in `prost` slightly faster, although there's still a big delta between 0.5 and 0.6. See danburkert/prost#381. --- src/buf/buf_mut.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs index fb3623d25..f2963c33d 100644 --- a/src/buf/buf_mut.rs +++ b/src/buf/buf_mut.rs @@ -1034,15 +1034,15 @@ unsafe impl BufMut for Vec { #[inline] fn bytes_mut(&mut self) -> &mut UninitSlice { - if self.capacity() == self.len() { + let len = self.len(); + if self.capacity() == len { self.reserve(64); // Grow the vec } let cap = self.capacity(); - let len = self.len(); let ptr = self.as_mut_ptr(); - unsafe { &mut UninitSlice::from_raw_parts_mut(ptr, cap)[len..] } + unsafe { UninitSlice::from_raw_parts_mut(ptr.offset(len as isize), cap - len) } } // Specialize these methods so they can skip checking `remaining_mut` From bec0ba26a6a8a2ad1037a33884350608667f95f1 Mon Sep 17 00:00:00 2001 From: Dan Burkert Date: Mon, 9 Nov 2020 00:25:08 -0800 Subject: [PATCH 2/3] inline Vec::put_slice --- src/buf/buf_mut.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs index f2963c33d..4ead1122e 100644 --- a/src/buf/buf_mut.rs +++ b/src/buf/buf_mut.rs @@ -1069,6 +1069,7 @@ unsafe impl BufMut for Vec { } } + #[inline] fn put_slice(&mut self, src: &[u8]) { self.extend_from_slice(src); } From ecf8dedbb48f7401e76aa089cabe87b59d18632f Mon Sep 17 00:00:00 2001 From: Dan Burkert Date: Mon, 9 Nov 2020 00:39:13 -0800 Subject: [PATCH 3/3] offset -> add --- src/buf/buf_mut.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/buf/buf_mut.rs b/src/buf/buf_mut.rs index 4ead1122e..fb00bdf11 100644 --- a/src/buf/buf_mut.rs +++ b/src/buf/buf_mut.rs @@ -1042,7 +1042,7 @@ unsafe impl BufMut for Vec { let cap = self.capacity(); let ptr = self.as_mut_ptr(); - unsafe { UninitSlice::from_raw_parts_mut(ptr.offset(len as isize), cap - len) } + unsafe { UninitSlice::from_raw_parts_mut(ptr.add(len), cap - len) } } // Specialize these methods so they can skip checking `remaining_mut`