perf(h1): use faster flattening of body buffers
This commit is contained in:
@@ -338,12 +338,24 @@ where
|
||||
WriteBufAuto::new(self)
|
||||
}
|
||||
|
||||
pub(super) fn buffer<BB: Buf + Into<B>>(&mut self, buf: BB) {
|
||||
pub(super) fn buffer<BB: Buf + Into<B>>(&mut self, mut buf: BB) {
|
||||
debug_assert!(buf.has_remaining());
|
||||
match self.strategy {
|
||||
Strategy::Flatten => {
|
||||
let head = self.headers_mut();
|
||||
head.bytes.put(buf);
|
||||
//perf: This is a little faster than <Vec as BufMut>>::put,
|
||||
//but accomplishes the same result.
|
||||
loop {
|
||||
let adv = {
|
||||
let slice = buf.bytes();
|
||||
if slice.is_empty() {
|
||||
return;
|
||||
}
|
||||
head.bytes.extend_from_slice(slice);
|
||||
slice.len()
|
||||
};
|
||||
buf.advance(adv);
|
||||
}
|
||||
},
|
||||
Strategy::Auto | Strategy::Queue => {
|
||||
self.queue.bufs.push_back(buf.into());
|
||||
@@ -548,6 +560,9 @@ mod tests {
|
||||
use std::io::Read;
|
||||
use mock::AsyncIo;
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
use test::Bencher;
|
||||
|
||||
#[cfg(test)]
|
||||
impl<T: Read> MemRead for ::mock::AsyncIo<T> {
|
||||
fn read_mem(&mut self, len: usize) -> Poll<Bytes, io::Error> {
|
||||
@@ -684,4 +699,22 @@ mod tests {
|
||||
assert_eq!(buffered.io.num_writes(), 4);
|
||||
assert_eq!(buffered.write_buf.queue.bufs.len(), 0);
|
||||
}
|
||||
|
||||
#[cfg(feature = "nightly")]
|
||||
#[bench]
|
||||
fn bench_write_buf_flatten_buffer_chunk(b: &mut Bencher) {
|
||||
let s = "Hello, World!";
|
||||
b.bytes = s.len() as u64;
|
||||
|
||||
let mut write_buf = WriteBuf::<::Chunk>::new();
|
||||
write_buf.set_strategy(Strategy::Flatten);
|
||||
b.iter(|| {
|
||||
let chunk = ::Chunk::from(s);
|
||||
write_buf.buffer(chunk);
|
||||
::test::black_box(&write_buf);
|
||||
unsafe {
|
||||
write_buf.headers.bytes.set_len(0);
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user