为什么 运行 cargo bench 比 运行 release build 快?
Why is running cargo bench faster than running release build?
我想对我的 Rust 程序进行基准测试,并且正在比较一些替代方案来做到这一点。但是,我注意到,当 运行 使用 cargo bench
和 bencher
板条箱进行基准测试时,代码运行速度始终比 运行 生产构建(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()
时,基准测试代码实际上不会执行任何操作,因为编译器能够确定您的代码的结果未被使用,并且不会观察到任何副作用。因此,它会在消除死代码期间删除所有代码,而您最终进行基准测试的是基准测试套件本身。
我想对我的 Rust 程序进行基准测试,并且正在比较一些替代方案来做到这一点。但是,我注意到,当 运行 使用 cargo bench
和 bencher
板条箱进行基准测试时,代码运行速度始终比 运行 生产构建(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()
时,基准测试代码实际上不会执行任何操作,因为编译器能够确定您的代码的结果未被使用,并且不会观察到任何副作用。因此,它会在消除死代码期间删除所有代码,而您最终进行基准测试的是基准测试套件本身。