rust - 为什么运行 cargo bench 比运行 release build 更快?

标签 rust benchmarking

我想对我的 Rust 程序进行基准测试,并正在比较一些替代方案来做到这一点。然而,我注意到,当使用 cargo benchbencher crate 运行基准测试时,代码的运行速度始终比运行生产构建(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 比运行 release build 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67144452/

相关文章:

windows - 创建流程时是否存在系统事件?

node.js - Node.js 中的 UDP 发送性能

Hadoop:是否可以以非 hdfs 用户身份运行 TestDFSIO 基准测试

sql - MySQL 查询成本

C++ 数据访问基准

rust - Read::read_exact 不填充缓冲区

rust - RwLock 什么时候会 panic 而不是死锁?

rust - 从函数返回 libusb::Device 的问题 - 尝试返回引用当前函数拥有的数据的值

thread-safety - 为什么 `Arc<T>` 要求 T 既是 `Send` 又是 `Sync` 才能成为 `Send`/`Sync` 本身?

python - 在有和没有SciPy的情况下计算k组合的数量