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> {
|
pub fn read_from_io(&mut self) -> Poll<usize, io::Error> {
|
||||||
use bytes::BufMut;
|
use bytes::BufMut;
|
||||||
self.read_blocked = false;
|
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 {
|
if self.read_buf.remaining_mut() < INIT_BUFFER_SIZE {
|
||||||
self.read_buf.reserve(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 {
|
self.io.read_buf(&mut self.read_buf).map(|ok| {
|
||||||
let n = match self.io.read(self.read_buf.bytes_mut()) {
|
match ok {
|
||||||
Ok(n) => n,
|
Async::Ready(n) => {
|
||||||
Err(e) => {
|
debug!("read {} bytes", n);
|
||||||
if e.kind() == io::ErrorKind::WouldBlock {
|
Async::Ready(n)
|
||||||
self.read_blocked = true;
|
},
|
||||||
return Ok(Async::NotReady);
|
Async::NotReady => {
|
||||||
}
|
self.read_blocked = true;
|
||||||
return Err(e)
|
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 {
|
pub fn buffer<B: AsRef<[u8]>>(&mut self, buf: B) -> usize {
|
||||||
|
|||||||
Reference in New Issue
Block a user