2 个版本

0.1.1 2021 年 1 月 24 日
0.1.0 2021 年 1 月 24 日

#34性能分析

Download history 17043/week @ 2024-03-14 18132/week @ 2024-03-21 16769/week @ 2024-03-28 18527/week @ 2024-04-04 19554/week @ 2024-04-11 18879/week @ 2024-04-18 14292/week @ 2024-04-25 16866/week @ 2024-05-02 15018/week @ 2024-05-09 16919/week @ 2024-05-16 17486/week @ 2024-05-23 18588/week @ 2024-05-30 17228/week @ 2024-06-06 17580/week @ 2024-06-13 20264/week @ 2024-06-20 14246/week @ 2024-06-27

72,993 每月下载量
用于 56 个包

Apache-2.0/MIT

23KB
317

Iai

Rust 中的实验性一次性基准框架
Continuous integration

Iai 是一个实验性的基准测试工具,使用 Cachegrind 来执行非常精确的一次性测量。

目录

功能

  • 精度:高精度测量允许你可靠地检测代码中的微小优化
  • 一致性:Iai 即使在虚拟化的 CI 环境中也能进行准确的测量
  • 性能:由于 Iai 只执行一次基准测试,通常比统计基准测试运行得更快
  • 分析:在基准测试时,Iai 会生成你的代码的 Cachegrind 分析文件,因此你可以使用兼容 Cachegrind 的工具来详细分析结果
  • 稳定兼容:无需安装 nightly Rust 即可基准测试你的代码

快速入门

为了使用 Iai,您必须安装 Valgrind。这意味着 Iai 不能在不支持 Valgrind 的平台上使用。

要开始使用 Iai,请将以下内容添加到您的 Cargo.toml 文件中

[dev-dependencies]
iai = "0.1"

[[bench]]
name = "my_benchmark"
harness = false

接下来,通过创建一个包含以下内容的文件在 $PROJECT/benches/my_benchmark.rs 中定义一个基准测试

use iai::{black_box, main};

fn fibonacci(n: u64) -> u64 {
    match n {
        0 => 1,
        1 => 1,
        n => fibonacci(n-1) + fibonacci(n-2),
    }
}

fn iai_benchmark_short() -> u64 {
    fibonacci(black_box(10))
}

fn iai_benchmark_long() -> u64 {
    fibonacci(black_box(30));
}


iai::main!(iai_benchmark_short, iai_benchmark_long);

最后,使用 cargo bench 运行此基准测试。你应该会看到类似以下的内容

     Running target/release/deps/test_regular_bench-8b173c29ce041afa

bench_fibonacci_short
  Instructions:                1735
  L1 Accesses:                 2364
  L2 Accesses:                    1
  RAM Accesses:                   1
  Estimated Cycles:            2404

bench_fibonacci_long
  Instructions:            26214735
  L1 Accesses:             35638623
  L2 Accesses:                    2
  RAM Accesses:                   1
  Estimated Cycles:        35638668

目标

Iai 的主要目标是提供一个简单且精确的工具,以可靠地检测代码性能的微小变化。此外,它应该尽可能适合程序员使用,并使创建可靠、有用的基准测试变得容易。

与 Criterion-rs 的比较

我希望 Iai 成为 Criterion-rs 的补充,而不是竞争对手。这两个项目以不同的方式测量不同的事情,具有不同的优缺点和限制,因此对于大多数项目来说,最佳方法是同时使用这两个项目。

以下是重要差异的概述

  • 临时缺点:目前Iai缺乏许多 Criterion-rs 的功能,包括报告和任何类型的配置。
    • 当前的意图是添加对 Cargo-criterion 的支持,用于配置和报告 Iai 基准测试。
  • 优点:Iai 可以可靠地检测到比 Criterion-rs 更小的性能变化。
  • 优点:Iai 可以在嘈杂的 CI 环境中可靠地工作,甚至可以在 GitHub Actions 或 Travis-CI 等云 CI 提供商中工作,而 Criterion-rs 则不能。
  • 优点:Iai 还可以无需额外努力从基准测试生成配置文件输出。
  • 优点:虽然 Cachegrind 添加了相当大的运行时开销,但运行每个基准测试正好一次通常比 Criterion-rs 的统计测量要快。
  • 混合:由于 Iai 可以检测到如此小的变化,它可能会报告由于内存中函数顺序或其他编译器细节变化而导致的性能差异。
  • 缺点:Iai 的测量仅与系统时间相关(这通常是您真正关心的),而 Criterion-rs 则直接测量。
  • 缺点:Iai 不能排除测量中的设置代码,而 Criterion-rs 可以。
  • 缺点:因为 Cachegrind 不测量系统调用,所以 IO 时间无法准确测量。
  • 缺点:由于 Iai 运行基准测试正好一次,因此它不能测量由 OS 线程调度或哈希表随机化等因素引起的性能变化。
  • 限制:Iai 仅适用于 Valgrind 支持的平台。值得注意的是,这不包括 Windows。

对于在 CI 中运行的基准测试(尤其是如果您正在云 CI 上检查拉取请求的性能回归),您应使用 Iai。对于在 Windows 或 Valgrind 不支持的平台上进行基准测试,您应使用 Criterion-rs。对于其他情况,我建议同时使用两者。Iai 提供了更高的精度,并且更适合更大的基准测试,而 Criterion-rs 允许排除设置时间,并为您提供更多有关代码实际运行时间和受线程或哈希表随机化等非确定性影响程度的信息。如果您绝对需要选择其中之一,Iai 可能是更好的选择。

贡献

首先,感谢您的贡献。

为 Iai 做贡献的一个很好的方法是将其用于自己的基准测试需求,并报告您的经验,提交和评论问题等。

以拉取请求形式提交的代码或文档改进也受欢迎。如果您不确定要做什么,请尝试查看 入门标签

如果在几天内您的問題或拉取请求没有回应,请随时 ping 我 (@bheisler)。

有关更多详细信息,请参阅 CONTRIBUTING.md 文件

兼容性策略

Iai 支持 Rust 的最后三个稳定次要版本。在撰写本文时,这意味着 Rust 1.48 或更高版本。较旧版本可能可以工作,但没有经过测试或保证。

目前,被认为可以工作的 Rust 的最旧版本是 1.48。Iai 的未来版本可能会停止支持比 3 个版本之前的版本,这不会被视为破坏性更改。如果您需要 Iai 在旧版本的 Rust 上工作,您将需要坚持使用 Iai 的特定补丁版本。

维护

Iai最初由 Brook Heisler (@bheisler) 编写并维护。

许可协议

Iai 在 Apache 2.0 许可证和 MIT 许可证下双许可。

依赖项