diff options
| author | bors <bors@rust-lang.org> | 2015-07-08 21:12:54 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-07-08 21:12:54 +0000 |
| commit | 020d201a661746359430610ee811b0aaa242dea8 (patch) | |
| tree | 7fbc96b41a33a8773338b32861e6318a524b9afa /src/libstd | |
| parent | 15952ac6cf39c593ae2b9c2cd161f2e221324e6a (diff) | |
| parent | a5cc17adaadf9bc4da3b6b375879fda55ed823c9 (diff) | |
| download | rust-020d201a661746359430610ee811b0aaa242dea8.tar.gz rust-020d201a661746359430610ee811b0aaa242dea8.zip | |
Auto merge of #26849 - bluss:read-to-end-memset, r=alexcrichton
Improve zerofill in Vec::resize and Read::read_to_end We needed a more efficient way to zerofill the vector in read_to_end. This to reduce the memory intialization overhead to a minimum. Use the implementation of `std::vec::from_elem` (used for the vec![] macro) for Vec::resize as well. For simple element types like u8, this compiles to memset, so it makes Vec::resize much more efficient.
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/io/buffered.rs | 5 | ||||
| -rw-r--r-- | src/libstd/io/mod.rs | 12 | ||||
| -rw-r--r-- | src/libstd/lib.rs | 1 |
3 files changed, 12 insertions, 6 deletions
diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index d389a0be117..98d8bc6bdaf 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -19,7 +19,6 @@ use error; use fmt; use io::{self, DEFAULT_BUF_SIZE, Error, ErrorKind, SeekFrom}; use ptr; -use iter; /// Wraps a `Read` and buffers input from it. /// @@ -63,11 +62,9 @@ impl<R: Read> BufReader<R> { /// Creates a new `BufReader` with the specified buffer capacity. #[stable(feature = "rust1", since = "1.0.0")] pub fn with_capacity(cap: usize, inner: R) -> BufReader<R> { - let mut buf = Vec::with_capacity(cap); - buf.extend(iter::repeat(0).take(cap)); BufReader { inner: inner, - buf: buf, + buf: vec![0; cap], pos: 0, cap: 0, } diff --git a/src/libstd/io/mod.rs b/src/libstd/io/mod.rs index 9021f32fad0..50c44299dc7 100644 --- a/src/libstd/io/mod.rs +++ b/src/libstd/io/mod.rs @@ -16,7 +16,7 @@ use cmp; use rustc_unicode::str as core_str; use error as std_error; use fmt; -use iter::{self, Iterator, Extend}; +use iter::{Iterator}; use marker::Sized; use ops::{Drop, FnOnce}; use option::Option::{self, Some, None}; @@ -106,7 +106,7 @@ fn read_to_end<R: Read + ?Sized>(r: &mut R, buf: &mut Vec<u8>) -> Result<usize> if new_write_size < DEFAULT_BUF_SIZE { new_write_size *= 2; } - buf.extend(iter::repeat(0).take(new_write_size)); + buf.resize(len + new_write_size, 0); } match r.read(&mut buf[len..]) { @@ -984,6 +984,14 @@ mod tests { let mut v = Vec::new(); assert_eq!(c.read_to_end(&mut v).unwrap(), 1); assert_eq!(v, b"1"); + + let cap = 1024 * 1024; + let data = (0..cap).map(|i| (i / 3) as u8).collect::<Vec<_>>(); + let mut v = Vec::new(); + let (a, b) = data.split_at(data.len() / 2); + assert_eq!(Cursor::new(a).read_to_end(&mut v).unwrap(), a.len()); + assert_eq!(Cursor::new(b).read_to_end(&mut v).unwrap(), b.len()); + assert_eq!(v, data); } #[test] diff --git a/src/libstd/lib.rs b/src/libstd/lib.rs index 73e45619774..caf3f497e10 100644 --- a/src/libstd/lib.rs +++ b/src/libstd/lib.rs @@ -146,6 +146,7 @@ #![feature(unique)] #![feature(unsafe_no_drop_flag, filling_drop)] #![feature(vec_push_all)] +#![feature(vec_resize)] #![feature(wrapping)] #![feature(zero_one)] #![cfg_attr(windows, feature(str_utf16))] |
