diff --git a/src/libarena/lib.rs b/src/libarena/lib.rs index 856540989df55..3e3ecdda3b097 100644 --- a/src/libarena/lib.rs +++ b/src/libarena/lib.rs @@ -536,18 +536,18 @@ mod test { x: 1, y: 2, z: 3, - }); + }) }) } #[bench] pub fn bench_pod_nonarena(bh: &mut BenchHarness) { bh.iter(|| { - let _ = ~Point { + ~Point { x: 1, y: 2, z: 3, - }; + } }) } @@ -561,7 +561,7 @@ mod test { y: 2, z: 3, } - }); + }) }) } @@ -588,17 +588,17 @@ mod test { arena.alloc(Nonpod { string: ~"hello world", array: ~[ 1, 2, 3, 4, 5 ], - }); + }) }) } #[bench] pub fn bench_nonpod_nonarena(bh: &mut BenchHarness) { bh.iter(|| { - let _ = ~Nonpod { + ~Nonpod { string: ~"hello world", array: ~[ 1, 2, 3, 4, 5 ], - }; + } }) } @@ -606,10 +606,10 @@ mod test { pub fn bench_nonpod_old_arena(bh: &mut BenchHarness) { let arena = Arena::new(); bh.iter(|| { - let _ = arena.alloc(|| Nonpod { + arena.alloc(|| Nonpod { string: ~"hello world", array: ~[ 1, 2, 3, 4, 5 ], - }); + }) }) } } diff --git a/src/libextra/lib.rs b/src/libextra/lib.rs index 519192fd17766..109bf2e489b55 100644 --- a/src/libextra/lib.rs +++ b/src/libextra/lib.rs @@ -29,7 +29,7 @@ Rust extras are part of the standard Rust distribution. html_favicon_url = "http://www.rust-lang.org/favicon.ico", html_root_url = "http://static.rust-lang.org/doc/master")]; -#[feature(macro_rules, globs, managed_boxes)]; +#[feature(macro_rules, globs, managed_boxes, asm)]; #[deny(non_camel_case_types)]; #[deny(missing_doc)]; diff --git a/src/libextra/test.rs b/src/libextra/test.rs index d1fffd9e515c1..d809d69b58ed5 100644 --- a/src/libextra/test.rs +++ b/src/libextra/test.rs @@ -1091,13 +1091,25 @@ impl MetricMap { // Benchmarking +/// A function that is opaque to the optimiser, to allow benchmarks to +/// pretend to use outputs to assist in avoiding dead-code +/// elimination. +/// +/// This function is a no-op, and does not even read from `dummy`. +pub fn black_box(dummy: T) { + // we need to "use" the argument in some way LLVM can't + // introspect. + unsafe {asm!("" : : "r"(&dummy))} +} + + impl BenchHarness { /// Callback for benchmark functions to run in their body. - pub fn iter(&mut self, inner: ||) { + pub fn iter(&mut self, inner: || -> T) { self.ns_start = precise_time_ns(); let k = self.iterations; for _ in range(0u64, k) { - inner(); + black_box(inner()); } self.ns_end = precise_time_ns(); }