diff options
| author | Daniel Micay <danielmicay@gmail.com> | 2013-08-08 23:49:49 -0400 |
|---|---|---|
| committer | Daniel Micay <danielmicay@gmail.com> | 2013-08-11 03:14:35 -0400 |
| commit | 2afed31eccf0a5e2e996f2d1b3aa1ed79cb31821 (patch) | |
| tree | caac6a3d4fa410cc0b83dbe69b7f4a2fa34f1a1a /src/libstd | |
| parent | eebcff1493a98524e72bbf0c79b004fc286d58d7 (diff) | |
| download | rust-2afed31eccf0a5e2e996f2d1b3aa1ed79cb31821.tar.gz rust-2afed31eccf0a5e2e996f2d1b3aa1ed79cb31821.zip | |
vec: optimize the Add implementation
before: test add ... bench: 164 ns/iter (+/- 1) after: test add ... bench: 113 ns/iter (+/- 2)
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/vec.rs | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs index c831dd70918..d626b8604db 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<T>> Add<V, ~[T]> 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<T:Clone, V: Vector<T>> Add<V, ~[T]> 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; + } + } } |
