about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEduard Burtescu <edy.burt@gmail.com>2013-12-12 07:05:26 +0200
committerEduard Burtescu <edy.burt@gmail.com>2013-12-12 07:07:45 +0200
commit331c6efe45324ef1b81e3c3bd79281fc12de5123 (patch)
treef5d0a512224d7e90961f03ebf4419d03582dea22
parent1b12dca7f97a51c6cbb4f47ea6e095d841a97c1a (diff)
downloadrust-331c6efe45324ef1b81e3c3bd79281fc12de5123.tar.gz
rust-331c6efe45324ef1b81e3c3bd79281fc12de5123.zip
Inline Finallyalizer::drop, allowing LLVM to optimize `finally`.
* fixes the vec::from_elem regression caused by #8780
* added 5 benchmarks for allocating a 1KB ~[u8] and zeroing it
-rw-r--r--src/libstd/unstable/finally.rs1
-rw-r--r--src/libstd/vec.rs55
2 files changed, 56 insertions, 0 deletions
diff --git a/src/libstd/unstable/finally.rs b/src/libstd/unstable/finally.rs
index 6f92da5e93e..6faf69d2bb9 100644
--- a/src/libstd/unstable/finally.rs
+++ b/src/libstd/unstable/finally.rs
@@ -62,6 +62,7 @@ struct Finallyalizer<'a> {
 
 #[unsafe_destructor]
 impl<'a> Drop for Finallyalizer<'a> {
+    #[inline]
     fn drop(&mut self) {
         (self.dtor)();
     }
diff --git a/src/libstd/vec.rs b/src/libstd/vec.rs
index 78ed58ba356..c31e3b56444 100644
--- a/src/libstd/vec.rs
+++ b/src/libstd/vec.rs
@@ -4217,6 +4217,7 @@ mod bench {
     use vec;
     use vec::VectorVector;
     use option::*;
+    use ptr;
 
     #[bench]
     fn iterator(bh: &mut BenchHarness) {
@@ -4339,4 +4340,58 @@ mod bench {
                 vec.contains(&99u);
         })
     }
+
+    #[bench]
+    fn zero_1kb_from_elem(bh: &mut BenchHarness) {
+        bh.iter(|| {
+            let _v: ~[u8] = vec::from_elem(1024, 0u8);
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_set_memory(bh: &mut BenchHarness) {
+        bh.iter(|| {
+            let mut v: ~[u8] = vec::with_capacity(1024);
+            unsafe {
+                let vp = vec::raw::to_mut_ptr(v);
+                ptr::set_memory(vp, 0, 1024);
+                vec::raw::set_len(&mut v, 1024);
+            }
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_fixed_repeat(bh: &mut BenchHarness) {
+        bh.iter(|| {
+            let _v: ~[u8] = ~[0u8, ..1024];
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_loop_set(bh: &mut BenchHarness) {
+        // Slower because the { len, cap, [0 x T] }* repr allows a pointer to the length
+        // field to be aliased (in theory) and prevents LLVM from optimizing loads away.
+        bh.iter(|| {
+            let mut v: ~[u8] = vec::with_capacity(1024);
+            unsafe {
+                vec::raw::set_len(&mut v, 1024);
+            }
+            for i in range(0, 1024) {
+                v[i] = 0;
+            }
+        });
+    }
+
+    #[bench]
+    fn zero_1kb_mut_iter(bh: &mut BenchHarness) {
+        bh.iter(|| {
+            let mut v: ~[u8] = vec::with_capacity(1024);
+            unsafe {
+                vec::raw::set_len(&mut v, 1024);
+            }
+            for x in v.mut_iter() {
+                *x = 0;
+            }
+        });
+    }
 }