我正在运行这些基准测试,它们使用一个函数,该函数是一个计数到 10M 和 100M 的循环:
use crab::count_up_to;
use criterion::{black_box, criterion_group, criterion_main, Criterion};
use rand::Rng;
pub fn criterion_benchmark(c: &mut Criterion) {
c.bench_function("10M", |b| {
b.iter(|| {
let num = rand::thread_rng().gen_range(0..100);
let r = count_up_to(black_box(10_000_000 + num));
eprintln!("{}", r);
});
});
c.bench_function("100M", |b| {
b.iter(|| {
let r = count_up_to(100_000_000);
eprintln!("{}", black_box(r));
});
});
c.bench_function("hello", |b| {
b.iter(|| {
eprintln!("{}", "hello");
});
});
}
criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);
我添加了第三个基准,仅输出到 stderr 以供参考。您可能猜到的问题是,所有 3 个基准测试花费的时间相同,不到 1μs,这显然意味着
count_up_to
函数正在被优化。
我想知道为什么会这样,因为我最终使用了函数的结果,正如您在第一个测试(10M)中可能注意到的那样,参数并不总是相同,因为添加了一点随机噪声。我也尝试过在不同的地方使用
black_box
,但没有成功。
非常感谢任何帮助。
这是
Cargo.toml
以及 count_up_to
的实现:
[package]
name = "crab"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
[dev-dependencies]
criterion = { version = "0.4", features = ["html_reports"] }
rand = "0.8"
[[bench]]
name = "count"
harness = false
pub fn count_up_to(n: usize) -> usize {
let mut count = 0;
while count < n {
count += 1;
}
count / 2 * 100
}
编译器只是意识到循环等于
let count = n
:https://rust.godbolt.org/z/Mo1hGa5Pa。您可以添加black_box()
:count += std::hint::black_box(1);
。
此外,用
iter()
打印是一个非常糟糕的主意,它会占用所有时间。您还需要 black_box()
100_000_000
参数。