rollup merge of #19888: steveklabnik/gh19861

Fixes #19861

/cc @huonw
This commit is contained in:
Alex Crichton 2015-01-05 18:36:18 -08:00
commit 199ebc7bf7

View file

@ -503,6 +503,8 @@ Advice on writing benchmarks:
* Make the code in the `iter` loop do something simple, to assist in pinpointing
performance improvements (or regressions)
## Gotcha: optimizations
There's another tricky part to writing benchmarks: benchmarks compiled with
optimizations activated can be dramatically changed by the optimizer so that
the benchmark is no longer benchmarking what one expects. For example, the
@ -556,8 +558,12 @@ extern crate test;
# struct X;
# impl X { fn iter<T, F>(&self, _: F) where F: FnMut() -> T {} } let b = X;
b.iter(|| {
test::black_box(range(0u, 1000).fold(0, |old, new| old ^ new));
});
let mut n = 1000_u32;
test::black_box(&mut n); // pretend to modify `n`
range(0, n).fold(0, |a, b| a ^ b)
})
# }
```
@ -573,3 +579,6 @@ test bench_xor_1000_ints ... bench: 1 ns/iter (+/- 0)
test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured
```
However, the optimizer can still modify a testcase in an undesirable manner
even when using either of the above.