From 645bd69e57e37d1d34259178da48aa8a88f8a997 Mon Sep 17 00:00:00 2001 From: Dan Burkert Date: Mon, 9 Nov 2020 00:30:30 -0800 Subject: [PATCH 1/3] Add inline tags to UninitSlice methods This appears to be the primary cause of significant performance regressions in the `prost` test suite in the 0.5 to 0.6 transition. See danburkert/prost#381. --- src/buf/uninit_slice.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/buf/uninit_slice.rs b/src/buf/uninit_slice.rs index 32ebde4c5..b7b784b0d 100644 --- a/src/buf/uninit_slice.rs +++ b/src/buf/uninit_slice.rs @@ -40,6 +40,7 @@ impl UninitSlice { /// /// let slice = unsafe { UninitSlice::from_raw_parts_mut(ptr, len) }; /// ``` + #[inline] pub unsafe fn from_raw_parts_mut<'a>(ptr: *mut u8, len: usize) -> &'a mut UninitSlice { let maybe_init: &mut [MaybeUninit] = core::slice::from_raw_parts_mut(ptr as *mut _, len); @@ -64,10 +65,11 @@ impl UninitSlice { /// /// assert_eq!(b"boo", &data[..]); /// ``` + #[inline] pub fn write_byte(&mut self, index: usize, byte: u8) { assert!(index < self.len()); - unsafe { self[index..].as_mut_ptr().write(byte) } + unsafe { self.as_mut_ptr().offset(index as isize).write(byte) } } /// Copies bytes from `src` into `self`. @@ -90,6 +92,7 @@ impl UninitSlice { /// /// assert_eq!(b"bar", &data[..]); /// ``` + #[inline] pub fn copy_from_slice(&mut self, src: &[u8]) { use core::ptr; @@ -116,6 +119,7 @@ impl UninitSlice { /// let mut slice = &mut data[..]; /// let ptr = BufMut::bytes_mut(&mut slice).as_mut_ptr(); /// ``` + #[inline] pub fn as_mut_ptr(&mut self) -> *mut u8 { self.0.as_mut_ptr() as *mut _ } @@ -133,6 +137,7 @@ impl UninitSlice { /// /// assert_eq!(len, 3); /// ``` + #[inline] pub fn len(&self) -> usize { self.0.len() } @@ -150,6 +155,7 @@ macro_rules! impl_index { impl Index<$t> for UninitSlice { type Output = UninitSlice; + #[inline] fn index(&self, index: $t) -> &UninitSlice { let maybe_uninit: &[MaybeUninit] = &self.0[index]; unsafe { &*(maybe_uninit as *const [MaybeUninit] as *const UninitSlice) } @@ -157,6 +163,7 @@ macro_rules! impl_index { } impl IndexMut<$t> for UninitSlice { + #[inline] fn index_mut(&mut self, index: $t) -> &mut UninitSlice { let maybe_uninit: &mut [MaybeUninit] = &mut self.0[index]; unsafe { &mut *(maybe_uninit as *mut [MaybeUninit] as *mut UninitSlice) } From 70c55253b1243ad4280a70c9d95ec5f9a89512e8 Mon Sep 17 00:00:00 2001 From: Dan Burkert Date: Mon, 9 Nov 2020 00:38:19 -0800 Subject: [PATCH 2/3] Update src/buf/uninit_slice.rs Co-authored-by: Alice Ryhl --- src/buf/uninit_slice.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/buf/uninit_slice.rs b/src/buf/uninit_slice.rs index b7b784b0d..0ebc52ddb 100644 --- a/src/buf/uninit_slice.rs +++ b/src/buf/uninit_slice.rs @@ -69,7 +69,7 @@ impl UninitSlice { pub fn write_byte(&mut self, index: usize, byte: u8) { assert!(index < self.len()); - unsafe { self.as_mut_ptr().offset(index as isize).write(byte) } + unsafe { self.as_mut_ptr().add(index).write(byte) } } /// Copies bytes from `src` into `self`. From 7c8af6df934223fd14cce82cb465b322e611e629 Mon Sep 17 00:00:00 2001 From: Dan Burkert Date: Mon, 9 Nov 2020 13:03:13 -0800 Subject: [PATCH 3/3] ptr::add -> index --- src/buf/uninit_slice.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/buf/uninit_slice.rs b/src/buf/uninit_slice.rs index 0ebc52ddb..9127389f2 100644 --- a/src/buf/uninit_slice.rs +++ b/src/buf/uninit_slice.rs @@ -69,7 +69,7 @@ impl UninitSlice { pub fn write_byte(&mut self, index: usize, byte: u8) { assert!(index < self.len()); - unsafe { self.as_mut_ptr().add(index).write(byte) } + unsafe { self[index..].as_mut_ptr().write(byte) } } /// Copies bytes from `src` into `self`.