From a8913c53810934f88e2659f29bc1ee772f57a467 Mon Sep 17 00:00:00 2001 From: Roman Timushev Date: Tue, 14 May 2024 15:36:31 +0200 Subject: [PATCH 1/2] backport: optimize ::has_remaining --- src/collect.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/collect.rs b/src/collect.rs index b065fff..b0b0f0d 100644 --- a/src/collect.rs +++ b/src/collect.rs @@ -153,6 +153,11 @@ impl Buf for BufList { self.bufs.iter().map(|buf| buf.remaining()).sum() } + #[inline] + fn has_remaining(&self) -> bool { + self.bufs.iter().any(|buf| buf.has_remaining()) + } + #[inline] fn chunk(&self) -> &[u8] { self.bufs.front().map(Buf::chunk).unwrap_or_default() From 758d3e8cf9dea57265db436cdc8e709f05e9596d Mon Sep 17 00:00:00 2001 From: Roman Timushev Date: Tue, 14 May 2024 16:50:56 +0200 Subject: [PATCH 2/2] backport: improve BufList::copy_to_bytes if len == remaining --- src/collect.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/collect.rs b/src/collect.rs index b0b0f0d..0d0d9ae 100644 --- a/src/collect.rs +++ b/src/collect.rs @@ -209,9 +209,15 @@ impl Buf for BufList { } Some(front) if front.remaining() > len => front.copy_to_bytes(len), _ => { - assert!(len <= self.remaining(), "`len` greater than remaining"); + let rem = self.remaining(); + assert!(len <= rem, "`len` greater than remaining"); let mut bm = BytesMut::with_capacity(len); - bm.put(self.take(len)); + if rem == len { + // .take() costs a lot more, so skip it if we don't need it + bm.put(self); + } else { + bm.put(self.take(len)); + } bm.freeze() } }