perf(conn): use AsyncRead::read_buf to try skipping zeroing of buffer
This commit is contained in:
@@ -94,35 +94,21 @@ impl<T: AsyncRead + AsyncWrite> Buffered<T> {
|
||||
pub fn read_from_io(&mut self) -> Poll<usize, io::Error> {
|
||||
use bytes::BufMut;
|
||||
self.read_blocked = false;
|
||||
//TODO: use io.read_buf(), so we don't have to zero memory
|
||||
//Reason this doesn't use it yet is because benchmarks show the
|
||||
//slightest **decrease** in performance. Switching should be done
|
||||
//when it doesn't cost anything.
|
||||
if self.read_buf.remaining_mut() < INIT_BUFFER_SIZE {
|
||||
self.read_buf.reserve(INIT_BUFFER_SIZE);
|
||||
unsafe { // Zero out unused memory
|
||||
let buf = self.read_buf.bytes_mut();
|
||||
let len = buf.len();
|
||||
ptr::write_bytes(buf.as_mut_ptr(), 0, len);
|
||||
}
|
||||
}
|
||||
unsafe {
|
||||
let n = match self.io.read(self.read_buf.bytes_mut()) {
|
||||
Ok(n) => n,
|
||||
Err(e) => {
|
||||
if e.kind() == io::ErrorKind::WouldBlock {
|
||||
self.read_blocked = true;
|
||||
return Ok(Async::NotReady);
|
||||
}
|
||||
return Err(e)
|
||||
self.io.read_buf(&mut self.read_buf).map(|ok| {
|
||||
match ok {
|
||||
Async::Ready(n) => {
|
||||
debug!("read {} bytes", n);
|
||||
Async::Ready(n)
|
||||
},
|
||||
Async::NotReady => {
|
||||
self.read_blocked = true;
|
||||
Async::NotReady
|
||||
}
|
||||
};
|
||||
if n > 0 {
|
||||
debug!("read {} bytes", n);
|
||||
self.read_buf.advance_mut(n);
|
||||
}
|
||||
Ok(Async::Ready(n))
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
pub fn buffer<B: AsRef<[u8]>>(&mut self, buf: B) -> usize {
|
||||
|
||||
Reference in New Issue
Block a user