Merge pull request #599 from hyperium/zero-buf

perf(buffer): zero out buffers using memset instead of iter().take()
This commit is contained in:
Sean McArthur
2015-07-07 22:55:38 -07:00

View File

@@ -1,5 +1,4 @@
use std::cmp;
use std::iter;
use std::io::{self, Read, BufRead};
pub struct BufReader<R> {
@@ -21,7 +20,9 @@ impl<R: Read> BufReader<R> {
#[inline]
pub fn with_capacity(rdr: R, cap: usize) -> BufReader<R> {
let mut buf = Vec::with_capacity(cap);
buf.extend(iter::repeat(0).take(cap));
unsafe {
grow_zerofill(&mut buf, cap);
}
BufReader {
inner: rdr,
buf: buf,
@@ -71,11 +72,19 @@ impl<R: Read> BufReader<R> {
self.buf.reserve(cmp::min(cap * 4, MAX_BUFFER_SIZE) - cap);
let new = self.buf.capacity() - self.buf.len();
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> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
if self.cap == self.pos && buf.len() >= self.buf.len() {