Criterion 货物工作台的构建时间较长,但大型类型的货物构建 --release 则不然

Raf*_*ael 8 benchmarking build-time rust rust-cargo rust-criterion

在使用 Rust 开发Brainfuck解释器时,我注意到cargo bench当基准包含大型类型时,构建 Criterion 工作台需要花费非常长的时间。

作为 Brainfuck 实现的一部分,我定义了一个具有非常大数组的结构来充当解释器内存。当我使用 进行编译时cargo build --release,我的 crate 在几秒钟内即可构建完成,但是当我运行时,cargo bench构建需要 6 分钟以上!我最终意识到这与我的类型定义中的非常大的数组有关([u8; 30_000])。我认为我可以通过间接方式使类型更小,因此我将类型更改为 a ,Box<[u8; 30_000]>这确实显着减少了基准测试的构建时间。

我的问题是:为什么cargo bench构建比cargo build --release没有花费更长的时间Box<>,它们不应该使用相同的优化级别吗?为什么不用cargo build --release那么长时间Box<>

这可能是 Criterion 的一个错误吗?

我确认cargo bench --no-run --timings几乎所有的时间都在建造长凳本身。我还做了一个最小的可重现示例:

cargo --version
> cargo 1.64.0 (387270bc7 2022-09-16)
Run Code Online (Sandbox Code Playgroud)

货物.toml

cargo --version
> cargo 1.64.0 (387270bc7 2022-09-16)
Run Code Online (Sandbox Code Playgroud)

库文件

[package]
name = "large-type"
version = "0.1.0"
edition = "2021"

[dev-dependencies]
criterion = "0.4.0"

[[bench]]
name = "my_benches"
harness = false
Run Code Online (Sandbox Code Playgroud)

长凳/my_benches.rs

pub struct MyType {
    data: [u8; 30_000],
}

impl MyType {
    pub fn new() -> Self {
        MyType { data: [0; 30_000] }
    }
}
Run Code Online (Sandbox Code Playgroud)

干净的发布版本

$ cargo build --release
   Compiling large-type v0.1.0 (C:\Users\myuser\large-type)
    Finished release [optimized] target(s) in 0.22s
Run Code Online (Sandbox Code Playgroud)

超净工作台搭建

$ cargo bench --no-run
...
...
Compiling large-type v0.1.0 (C:\Users\myuser\large-type)
    Finished bench [optimized] target(s) in **3m 46s**
Run Code Online (Sandbox Code Playgroud)

大约 15 秒用于编译 Criterion 依赖项和我的库,其余时间用于Executable benches\my_benches.rs.

最后,当我确实更改[u8; 30_000]为时Box<[u8; 30_000]>,两者cargo build --releasecargo bench --no-run在非常合理的时间内完成。有任何想法吗?

编辑:我认为拳击是一个合适的解决方案,但我想尽可能避免性能受到影响,并理解为什么两个版本之间会有差异。

Pac*_*ace 0

您发布的命令cargo build不会构建基准。

# Does not build benchmarks
cargo build --release
Run Code Online (Sandbox Code Playgroud)

如果您想构建基准测试,则cargo build需要使用--all-targets(或--benches)

cargo build --release --all-targets
Run Code Online (Sandbox Code Playgroud)