diff options
| author | bors <bors@rust-lang.org> | 2013-12-13 15:46:32 -0800 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-12-13 15:46:32 -0800 |
| commit | 09bf5deb683d801c5e0905b19edfb22d32dad65a (patch) | |
| tree | 49e8952b63d21e90f7f0572a7f9d199146b4d65c /src/libstd | |
| parent | fbbadae80ffda04132e6cf1155e32cc6f910712d (diff) | |
| parent | 331c6efe45324ef1b81e3c3bd79281fc12de5123 (diff) | |
| download | rust-09bf5deb683d801c5e0905b19edfb22d32dad65a.tar.gz rust-09bf5deb683d801c5e0905b19edfb22d32dad65a.zip | |
auto merge of #10918 : eddyb/rust/inline-finally-dtor, r=thestinger
* fixes the vec::from_elem regression caused by #8780 * added 5 benchmarks for allocating a 1KB `~[u8]` and zeroing it * closes #7136
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/unstable/finally.rs | 1 | ||||
| -rw-r--r-- | src/libstd/vec.rs | 55 |
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; + } + }); + } } |
