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::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() {
|
||||
|
||||
Reference in New Issue
Block a user