auto merge of #21076 : sfackler/rust/bufferedreader-undef, r=Gankro
It's passed to the underlying reader, so uninitialized memory == sad times. We might want to shrink the default buffer size as well. 64k is pretty huge. Java uses 8k by default, and Go uses 4k for reference. r? @alexcrichton
This commit is contained in:
commit
d52398ef8c
1 changed files with 10 additions and 11 deletions
|
@ -15,7 +15,7 @@
|
|||
use cmp;
|
||||
use fmt;
|
||||
use io::{Reader, Writer, Stream, Buffer, DEFAULT_BUF_SIZE, IoResult};
|
||||
use iter::{IteratorExt, ExactSizeIterator};
|
||||
use iter::{IteratorExt, ExactSizeIterator, repeat};
|
||||
use ops::Drop;
|
||||
use option::Option;
|
||||
use option::Option::{Some, None};
|
||||
|
@ -62,17 +62,11 @@ impl<R> fmt::Show for BufferedReader<R> where R: fmt::Show {
|
|||
impl<R: Reader> BufferedReader<R> {
|
||||
/// Creates a new `BufferedReader` with the specified buffer capacity
|
||||
pub fn with_capacity(cap: uint, inner: R) -> BufferedReader<R> {
|
||||
// It's *much* faster to create an uninitialized buffer than it is to
|
||||
// fill everything in with 0. This buffer is entirely an implementation
|
||||
// detail and is never exposed, so we're safe to not initialize
|
||||
// everything up-front. This allows creation of BufferedReader instances
|
||||
// to be very cheap (large mallocs are not nearly as expensive as large
|
||||
// callocs).
|
||||
let mut buf = Vec::with_capacity(cap);
|
||||
unsafe { buf.set_len(cap); }
|
||||
BufferedReader {
|
||||
inner: inner,
|
||||
buf: buf,
|
||||
// We can't use the same trick here as we do for BufferedWriter,
|
||||
// since this memory is visible to the inner Reader.
|
||||
buf: repeat(0).take(cap).collect(),
|
||||
pos: 0,
|
||||
cap: 0,
|
||||
}
|
||||
|
@ -166,7 +160,12 @@ impl<W> fmt::Show for BufferedWriter<W> where W: fmt::Show {
|
|||
impl<W: Writer> BufferedWriter<W> {
|
||||
/// Creates a new `BufferedWriter` with the specified buffer capacity
|
||||
pub fn with_capacity(cap: uint, inner: W) -> BufferedWriter<W> {
|
||||
// See comments in BufferedReader for why this uses unsafe code.
|
||||
// It's *much* faster to create an uninitialized buffer than it is to
|
||||
// fill everything in with 0. This buffer is entirely an implementation
|
||||
// detail and is never exposed, so we're safe to not initialize
|
||||
// everything up-front. This allows creation of BufferedWriter instances
|
||||
// to be very cheap (large mallocs are not nearly as expensive as large
|
||||
// callocs).
|
||||
let mut buf = Vec::with_capacity(cap);
|
||||
unsafe { buf.set_len(cap); }
|
||||
BufferedWriter {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue