Rust Criterion 基准测试不起作用 – 已优化

问题描述 投票:0回答:1

我正在运行这些基准测试,它们使用一个函数,该函数是一个计数到 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
}
optimization rust benchmarking dead-code rust-criterion
1个回答
0
投票

编译器只是意识到循环等于

let count = n
https://rust.godbolt.org/z/Mo1hGa5Pa。您可以添加
black_box()
count += std::hint::black_box(1);

此外,用

iter()
打印是一个非常糟糕的主意,它会占用所有时间。您还需要
black_box()
100_000_000
参数。

© www.soinside.com 2019 - 2024. All rights reserved.