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