about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorDaniel Micay <danielmicay@gmail.com>2013-08-08 23:49:49 -0400
committerDaniel Micay <danielmicay@gmail.com>2013-08-11 03:14:35 -0400
commit2afed31eccf0a5e2e996f2d1b3aa1ed79cb31821 (patch)
treecaac6a3d4fa410cc0b83dbe69b7f4a2fa34f1a1a /src/libstd
parenteebcff1493a98524e72bbf0c79b004fc286d58d7 (diff)
downloadrust-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.rs19
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;
+        }
+    }
 }