From 2afed31eccf0a5e2e996f2d1b3aa1ed79cb31821 Mon Sep 17 00:00:00 2001 From: Daniel Micay Date: Thu, 8 Aug 2013 23:49:49 -0400 Subject: [PATCH] vec: optimize the Add implementation before: test add ... bench: 164 ns/iter (+/- 1) after: test add ... bench: 113 ns/iter (+/- 2) --- src/libstd/vec.rs | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index c831dd709182..d626b8604db8 100644 --- a/src/libstd/vec.rs +++ b/src/libstd/vec.rs @@ -561,7 +561,7 @@ impl<'self, T> RandomAccessIterator<&'self [T]> for ChunkIter<'self, T> { #[cfg(not(test))] pub mod traits { - use super::Vector; + use super::*; use clone::Clone; use cmp::{Eq, Ord, TotalEq, TotalOrd, Ordering, Equal, Equiv}; @@ -686,17 +686,17 @@ pub mod traits { impl<'self,T:Clone, V: Vector> Add for &'self [T] { #[inline] fn add(&self, rhs: &V) -> ~[T] { - let mut res = self.to_owned(); + let mut res = with_capacity(self.len() + rhs.as_slice().len()); + res.push_all(*self); res.push_all(rhs.as_slice()); res } } + impl> Add for ~[T] { #[inline] fn add(&self, rhs: &V) -> ~[T] { - let mut res = self.to_owned(); - res.push_all(rhs.as_slice()); - res + self.as_slice() + rhs.as_slice() } } } @@ -3662,4 +3662,13 @@ mod bench { } } } + + #[bench] + fn add(b: &mut BenchHarness) { + let xs: &[int] = [5, ..10]; + let ys: &[int] = [5, ..10]; + do b.iter() { + xs + ys; + } + } }