Criterion for Rust:完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 Criterion,为什么需要它?

\n\n

Criterion.rs 是一个强大且灵活的 Rust 语言基准测试(性能测试)库。它是 Haskell 中流行的 Criterion 库的直接对应版本,但针对 Rust 生态系统进行了适配。

\n\n

为什么需要 Criterion?与使用 std::time::Instant 进行简单计时不同,Criterion 提供了:

\n
    \n
  • 统计分析: 自动多次运行代码,收集执行时间样本,并计算平均值、中位数、标准差和百分位数。
  • \n
  • 与基准比较: 允许将当前代码版本的性能与之前版本进行比较(回归测试)。
  • \n
  • 生成报告: 创建带有图表和表格的精美 HTML 报告。
  • \n
  • 参数化基准测试: 轻松测试函数在不同输入数据下的性能。
  • \n
  • 抗噪声能力: Criterion 的算法能够抵抗由操作系统后台进程引起的执行时间波动。
  • \n
\n\n

该库对于以下开发者来说不可或缺:

\n
    \n
  • 优化关键代码段。
  • \n
  • 确保新代码不会降低旧功能的性能。
  • \n
  • 基于数据而非猜测做出决策。
  • \n
\n\n

在 Rust 项目中安装 Criterion

\n\n

与 Python(pip)或 Node.js(npm)不同,在 Rust 中,库的安装通过包管理器 Cargo 进行。Criterion 不是用于主代码的库,而是一个测试工具,因此应将其添加到 Cargo.toml 文件的 [dev-dependencies] 部分。

\n\n

您还需要在项目根目录(与 src/ 同级)创建一个 benches/ 目录。

\n\n

步骤 1:在 Cargo.toml 中添加依赖

\n
[dev-dependencies]\ncriterion = { version = "0.5", features = ["html_reports"] }
\n

注意: features = ["html_reports"] 标志用于启用 HTML 报告生成。没有它,将只有控制台文本输出。

\n\n

步骤 2:创建基准测试文件

\n

创建一个文件 benches/my_benchmark.rs(名称可以是任意的)。

\n\n

步骤 3:运行基准测试

\n
cargo bench
\n

此命令将以 release 模式(带优化)编译您的项目,并运行 benches/ 文件夹中的所有基准测试。

\n\n

快速入门:第一个基准测试

\n\n

让我们编写一个简单的基准测试,测量从 0 到 99 的数字求和速度。

\n\n
// benches/my_benchmark.rs\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\n\n// 我们要测试的函数\nfn sum_slow(n: u64) -> u64 {\n    let mut sum = 0;\n    for i in 0..n {\n        sum += i;\n    }\n    sum\n}\n\nfn sum_fast(n: u64) -> u64 {\n    n * (n - 1) / 2\n}\n\nfn criterion_benchmark(c: &mut Criterion) {\n    // 对基准测试进行分组\n    let mut group = c.benchmark_group("sum_comparison");\n    \n    group.bench_function("slow", |b| b.iter(|| sum_slow(black_box(100))));\n    group.bench_function("fast", |b| b.iter(|| sum_fast(black_box(100))));\n    \n    group.finish();\n}\n\n// 用于注册和运行的宏\ncriterion_group!(benches, criterion_benchmark);\ncriterion_main!(benches);
\n\n

这里发生了什么?

\n
    \n
  • black_box() — 告诉编译器该值应按原样传递,防止过早优化(编译器可能会在编译时计算常量,从而扭曲结果)。
  • \n
  • b.iter() — 基准测试的主循环。Criterion 将多次调用此闭包并测量时间。
  • \n
  • <

推荐