为什么运行货物台比运行发布构建更快



我想对我的Rust程序进行基准测试,并比较了一些替代方案。然而,我注意到,当使用cargo benchbencher机箱运行基准测试时,代码的运行速度始终快于使用相同代码运行生产构建(cargo build --release(。例如:

主要代码:

use dot_product;
const N: usize = 1000000;
use std::time;
fn main() {
let start = time::Instant::now();
dot_product::rayon_parallel([1; N].to_vec(), [2; N].to_vec());
println!("Time: {:?}", start.elapsed());
}

平均时间:~20ms

基准代码:

#[macro_use]
extern crate bencher;
use dot_product;
use bencher::Bencher;
const N: usize = 1000000;
fn parallel(bench: &mut Bencher) {
bench.iter(|| dot_product::rayon_parallel([1; N].to_vec(), [2; N].to_vec()))
}
benchmark_group!(benches, sequential, parallel);
benchmark_main!(benches);

时间:5,006,199 ns/iter (+/- 1,320,975)

我在其他一些程序中也尝试了同样的方法,cargo bench总是能给出更快的结果。为什么会发生这种情况?

正如注释所建议的,您应该对基准测试代码中的所有(最终(结果使用criterion::black_box()。这个函数什么都不做,只是返回它唯一的参数,但对优化器来说是不透明的,所以编译器必须假设这个函数对输入做了的事情

当不使用black_box()时,基准测试代码实际上不会做任何事情,因为编译器能够发现代码的结果是未使用的,并且不会观察到任何副作用。因此,它在消除死代码的过程中删除了所有的代码,而最终进行基准测试的是基准测试套件本身。

最新更新