基准测试程序适配器
适配器将基准测试工具的输出转换为 Bencher Metric Format (BMF) JSON。当API服务器收到一份新报告时,适配器会运行。更多细节请参见基准测试概览。可以为bencher run CLI 子命令通过--adapter选项指定一个适配器。如果没有指定适配器,那么默认使用 magic 适配器。
🪄 魔法 (默认)
魔法适配器(magic)是所有其他适配器的超集。
因此,它是 bencher run 的默认适配器。
然而,magic 适配器应仅用于探索。
为获得最佳结果,您应该指定一个基准测试驱动适配器:
- {…} JSON
- #️⃣ C# BenchmarkDotNet
- ➕ C++ Catch2
- ➕ C++ Google Benchmark
- 🕳 Go test -bench
- ☕️ Java 微基准测试套件(JMH)
- 🕸 JavaScript Benchmark.js
- 🕸 JavaScript console.time/console.timeEnd
- 🐍 Python airspeed velocity (asv)
- 🐍 Python pytest-benchmark
- ♦️ Ruby Benchmark
- 🦀 Rust libtest bench
- 🦀 Rust Criterion
- 🦀 Rust Iai
- 🦀 Rust Gungraun
- ❯_ Shell Hyperfine
{…} JSON
JSON 适配器(json)期望 Bencher 指标格式 (BMF) JSON。
它非常适合将自定义基准测试工具与 Bencher 集成。
有关更多详细信息,请参阅如何跟踪自定义基准测试
以及 BMF JSON 参考资料。
bencher run --adapter json "bencher mock"⏱️ 构建时间
bencher run CLI 子命令可以用于使用 --build-time 标志来跟踪交付物的构建时间(即编译时间)。在底层,bencher run 将结果输出为 Bencher Metric Format (BMF) JSON。因此,明确使用 the json adapter 是一种良好的实践。更多详情请参见如何跟踪构建时间。
build-time 度量(即 seconds (s))被收集。只有构建时间的值(即 value)是可用的。lower_value 和 upper_value 都不被收集。build-time 度量并非默认为所有项目创建。然而,当你使用 --build-time 标志时,这个度量将会自动为你的项目创建。
bencher run --adapter json --build-time "echo 0 > binary"⚖️ 文件大小
bencher run CLI子命令
可以用来通过--file-size选项追踪你的交付物的文件大小(即二进制大小)。
--file-size选项期望一个文件路径,来测量该文件的大小。
在底层,bencher run
将结果输出为Bencher度量格式(BMF)JSON。
因此,明确使用the json adapter是一个好习惯。
更多详情参见如何追踪文件大小。
收集到的file-size度量(即字节(B))。
只有文件大小值(即value)是可用的。
不收集lower_value或upper_value。
默认情况下不会为所有项目创建file-size度量。
然而,当你使用--file-size选项时,这个度量会自动为你的项目创建。
--file-size 选项可以使用多次来跟踪多个文件大小。
bencher run --adapter json --file-size binary "echo 0 > binary"#️⃣ C# DotNet
C# DotNet 适配器 (c_sharp_dot_net) 期望BenchmarkDotNet的输出为JSON格式(即使用 --exporters json 选项)。
会收集延迟度量(即 纳秒 (ns))。
这个 JSON 输出被保存到一个文件中,因此你必须使用 bencher run CLI 的 --file 参数来指定该文件路径。
bencher run --adapter c_sharp_dot_net --file results.json "dotnet run --exporters json --filter '*'"度量有两个选项:
mean(默认):lower_value和upper_value分别是标准差下方和上方的平均值(即value)。median:lower_value和upper_value分别是四分位距下方和上方的中位数(即value)。
这可以在 bencher运行 CLI 子命令中用 --average 选项来指定。
➕ C++ Catch2
C++ Catch2 适配器(cpp_catch2)期望 Catch2 输出。
将收集 latency 度量(即 纳秒 (ns))。
lower_value 和 upper_value 分别是低于和高于均值(即 value)的一个标准差。
bencher run --adapter cpp_catch2 "make benchmarks"➕ C++ 谷歌
C++ 谷歌适配器 (cpp_google) 期望以 JSON 格式(即 --benchmark_format=json) 接收 Google Benchmark 输出。
将收集 延迟 测量值(即 纳秒 (ns))。
只有平均值(即 value)可用。没有 lower_value 和 upper_value。
bencher run --adapter cpp_google "make benchmarks --benchmark_format=json"🕳 Go 基准测试
Go 基准测试适配器(go_bench)预期的输出是 go test -bench。
收集的是延迟度量(即纳秒 (ns))。
只提供均值(即值),没有最小值和最大值。
bencher run --adapter go_bench "go test -bench"☕️ Java JMH
Java JMH 适配器(java_jmh)期望 Java 微基准测试工具 (JMH) 的输出以 JSON格式(即 -rf json) 出现
这个 JSON 输出被保存到一个文件中,因此你必须使用 bencher run CLI 的 --file 参数来指定该文件路径。
可以收集延迟和吞吐量度量(即纳秒(ns)和每秒操作数(ops/sec))。lower_value 和 upper_value 分别是均值(即value)的下限和上限置信区间。
bencher run --adapter java_jmh --file results.json "java -jar benchmarks.jar -rf json -rff results.json"🕸 JavaScript 基准测试
JavaScript 基准测试适配器(js_benchmark)需要 Benchmark.js 的输出。
收集的是 throughput 测量值(即 每秒操作数(ops/sec))。
lower_value 和 upper_value 是相对于中值(即 value)的下方和上方的误差幅度。
bencher run --adapter js_benchmark "node benchmarks.js"🕸 JavaScript 时间
JavaScript 时间适配器(js_time)期望 console.time/console.timeEnd 的输出。
收集的是 延迟 测量值(即 纳秒 (ns))。
仅提供操作时间(即 value),没有 lower_value 和 upper_value。
bencher run --adapter js_time "node benchmarks.js"🐍 Python ASV
Python ASV 适配器(python_asv)期望 airspeed velocity CLI asv run 输出。
将收集 延迟 测量值(即 纳秒 (ns))。
lower_value 和 upper_value 分别是中位数(即 value)以下和以上的四分位距。
bencher run --adapter python_asv "asv run"🐍 Python Pytest
Python Pytest 适配器(python_pytest)期望 pytest-benchmark 的输出以 JSON 格式(即 --benchmark-json results.json)。
这个 JSON 输出被保存到一个文件中,因此你必须使用 bencher run CLI 的 --file 参数来指定该文件路径。
延迟 测量指标(即 纳秒 (ns))会被收集。
bencher run --adapter python_pytest --file results.json "pytest --benchmark-json results.json benchmarks.py"有两个选项用于指标:
平均值(默认):lower_value和upper_value分别是平均值(即value)标准差以下和以上。中位数:lower_value和upper_value分别是中位数(即value)的四分位距以下和以上。
可以使用 bencher run CLI 子命令中的可选 --average 参数来指定这一点。
♦️ Ruby 基准测试
Ruby 基准测试适配器(ruby_benchmark)期望 Benchmark 模块 对于 #bm、#bmbm、和 #benchmark 方法的输出。
每个基准测试都需要一个标签。
将收集 latency 测量值(即 纳秒 (ns))。
只提供报告值(即 value),没有 lower_value 和 upper_value。
bencher run --adapter ruby_benchmark "ruby benchmarks.rb"🦀 Rust 基准测试
Rust 基准测试适配器(rust_bench)期望 libtest bench 输出。
收集的延迟度量(即纳秒(ns))。
lower_value 和 upper_value 分别是低于和高于中位数(即value)的偏差。
bencher run --adapter rust_bench "cargo +nightly bench"🦀 Rust Criterion
Rust Criterion 适配器(rust_criterion)期待 Criterion 的输出。
会收集 latency 测量(即 纳秒 (ns))。
lower_value 和 upper_value 分别是斜率(如果可用)或平均值(如果不可用)的下限和上限(即 值)。
bencher run --adapter rust_criterion "cargo bench"🦀 Rust Iai
Rust Iai 适配器(rust_iai)期望 Iai 输出。
将收集 instructions、l1-accesses、l2-accesses、ram-accesses 和 estimated-cycles 测量值。
只有这些测量值(即 value)可用。没有 lower_value 和 upper_value 测量值。
对于所有项目,这个适配器的测量值默认不会被创建。
然而,当你使用这个适配器时,这些测量值将会为你的项目自动创建。
bencher run --adapter rust_iai "cargo bench"🦀 Rust Gungraun
Rust Gungraun 适配器(rust_gungraun)期望接收 Gungraun 的输出。
instructions、l1-hits、l2-hits、ram-hits、total-read-write 和 estimated-cycles 这些 Measures 默认会被收集。Gungraun 还支持生成的额外 Callgrind、Cachegrind 和 DHAT 指标。
对于这些 Measures,仅上报的值(即 value)可用。
不会收集 lower_value 或 upper_value。
该适配器的 Measures 不会在所有项目中默认创建。
不过,当你使用此适配器时,这些 Measures 会自动为你的项目创建。
Gungraun 是 Iai-Callgrind 的更名继任者。
bencher run --adapter rust_gungraun "cargo bench"🦀 Rust Iai-Callgrind
Iai-Callgrind 已更名为 Gungraun.
❯_️ Shell Hyperfine
Shell Hyperfine 适配器(shell_hyperfine)期望 Hyperfine 的输出以 JSON格式(即 --export-json results.json) 出现。这个 JSON 输出会被保存到一个文件中,因此你必须使用 bencher run CLI 的 --file 参数来指定该文件路径。将会收集到 latency 测量值(即 纳秒 (ns))。
bencher run --adapter shell_hyperfine --file results.json "hyperfine --export-json results.json 'sleep 0.1'"对于指标有两个选项:
mean(默认):lower_value和upper_value分别为标准差以下和以上的平均值(即value)。median:lower_value和upper_value分别为min和max值。
这可以在 bencher run CLI 子命令中使用 --average 选项来指定。
🐰 恭喜!你已经学习了所有关于基准测试程序适配器的知识!🎉