perf(buffer): zero out buffers using memset instead of iter().take()
This commit is contained in:
		| @@ -1,5 +1,4 @@ | |||||||
| use std::cmp; | use std::cmp; | ||||||
| use std::iter; |  | ||||||
| use std::io::{self, Read, BufRead}; | use std::io::{self, Read, BufRead}; | ||||||
|  |  | ||||||
| pub struct BufReader<R> { | pub struct BufReader<R> { | ||||||
| @@ -21,7 +20,9 @@ impl<R: Read> BufReader<R> { | |||||||
|     #[inline] |     #[inline] | ||||||
|     pub fn with_capacity(rdr: R, cap: usize) -> BufReader<R> { |     pub fn with_capacity(rdr: R, cap: usize) -> BufReader<R> { | ||||||
|         let mut buf = Vec::with_capacity(cap); |         let mut buf = Vec::with_capacity(cap); | ||||||
|         buf.extend(iter::repeat(0).take(cap)); |         unsafe { | ||||||
|  |             grow_zerofill(&mut buf, cap); | ||||||
|  |         } | ||||||
|         BufReader { |         BufReader { | ||||||
|             inner: rdr, |             inner: rdr, | ||||||
|             buf: buf, |             buf: buf, | ||||||
| @@ -71,11 +72,19 @@ impl<R: Read> BufReader<R> { | |||||||
|             self.buf.reserve(cmp::min(cap * 4, MAX_BUFFER_SIZE) - cap); |             self.buf.reserve(cmp::min(cap * 4, MAX_BUFFER_SIZE) - cap); | ||||||
|             let new = self.buf.capacity() - self.buf.len(); |             let new = self.buf.capacity() - self.buf.len(); | ||||||
|             trace!("reserved {}", new); |             trace!("reserved {}", new); | ||||||
|             self.buf.extend(iter::repeat(0).take(new)); |             unsafe { grow_zerofill(&mut self.buf, new) } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #[inline] | ||||||
|  | unsafe fn grow_zerofill(buf: &mut Vec<u8>, additional: usize) { | ||||||
|  |     use std::ptr; | ||||||
|  |     let len = buf.len(); | ||||||
|  |     buf.set_len(len + additional); | ||||||
|  |     ptr::write_bytes(buf.as_mut_ptr(), 0, buf.len()); | ||||||
|  | } | ||||||
|  |  | ||||||
| impl<R: Read> Read for BufReader<R> { | impl<R: Read> Read for BufReader<R> { | ||||||
|     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { |     fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { | ||||||
|         if self.cap == self.pos && buf.len() >= self.buf.len() { |         if self.cap == self.pos && buf.len() >= self.buf.len() { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user