From 3839696529213ceaa12eb0da28c3dad10c8b99e7 Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Fri, 17 Oct 2014 02:48:29 +0200 Subject: [PATCH] Optimize BufferedReader::read for large buffers. This optimizes `read` for the case in which the number of bytes requested is larger than the internal buffer. Note that the first comparison occurs again right afterwards and should thus be free. The second comparison occurs only in the cold branch. --- src/libstd/io/buffered.rs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libstd/io/buffered.rs b/src/libstd/io/buffered.rs index 8ab0d3a550401..95c44e6a3fc89 100644 --- a/src/libstd/io/buffered.rs +++ b/src/libstd/io/buffered.rs @@ -104,6 +104,9 @@ impl Buffer for BufferedReader { impl Reader for BufferedReader { fn read(&mut self, buf: &mut [u8]) -> IoResult { + if self.pos == self.cap && buf.len() >= self.buf.capacity() { + return self.inner.read(buf); + } let nread = { let available = try!(self.fill_buf()); let nread = cmp::min(available.len(), buf.len()); @@ -409,13 +412,19 @@ mod test { #[test] fn test_buffered_reader() { - let inner = MemReader::new(vec!(0, 1, 2, 3, 4)); + let inner = MemReader::new(vec!(5, 6, 7, 0, 1, 2, 3, 4)); let mut reader = BufferedReader::with_capacity(2, inner); let mut buf = [0, 0, 0]; let nread = reader.read(buf); + assert_eq!(Ok(3), nread); + let b: &[_] = &[5, 6, 7]; + assert_eq!(buf.as_slice(), b); + + let mut buf = [0, 0]; + let nread = reader.read(buf); assert_eq!(Ok(2), nread); - let b: &[_] = &[0, 1, 0]; + let b: &[_] = &[0, 1]; assert_eq!(buf.as_slice(), b); let mut buf = [0];