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