什么是 Criterion,为什么需要它?
\n\nCriterion.rs 是一个强大且灵活的 Rust 语言基准测试(性能测试)库。它是 Haskell 中流行的 Criterion 库的直接对应版本,但针对 Rust 生态系统进行了适配。
\n\n为什么需要 Criterion?与使用 std::time::Instant 进行简单计时不同,Criterion 提供了:
- \n
- 统计分析: 自动多次运行代码,收集执行时间样本,并计算平均值、中位数、标准差和百分位数。 \n
- 与基准比较: 允许将当前代码版本的性能与之前版本进行比较(回归测试)。 \n
- 生成报告: 创建带有图表和表格的精美 HTML 报告。 \n
- 参数化基准测试: 轻松测试函数在不同输入数据下的性能。 \n
- 抗噪声能力: Criterion 的算法能够抵抗由操作系统后台进程引起的执行时间波动。 \n
该库对于以下开发者来说不可或缺:
\n- \n
- 优化关键代码段。 \n
- 确保新代码不会降低旧功能的性能。 \n
- 基于数据而非猜测做出决策。 \n
在 Rust 项目中安装 Criterion
\n\n与 Python(pip)或 Node.js(npm)不同,在 Rust 中,库的安装通过包管理器 Cargo 进行。Criterion 不是用于主代码的库,而是一个测试工具,因此应将其添加到 Cargo.toml 文件的 [dev-dependencies] 部分。
您还需要在项目根目录(与 src/ 同级)创建一个 benches/ 目录。
步骤 1:在 Cargo.toml 中添加依赖
\n[dev-dependencies]\ncriterion = { version = "0.5", features = ["html_reports"] }\n注意: features = ["html_reports"] 标志用于启用 HTML 报告生成。没有它,将只有控制台文本输出。
步骤 2:创建基准测试文件
\n创建一个文件 benches/my_benchmark.rs(名称可以是任意的)。
步骤 3:运行基准测试
\ncargo bench\n此命令将以 release 模式(带优化)编译您的项目,并运行 benches/ 文件夹中的所有基准测试。
快速入门:第一个基准测试
\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 - <