6个版本
0.2.4 | 2022年3月2日 |
---|---|
0.2.3 | 2021年11月29日 |
0.2.2 | 2021年6月27日 |
0.2.1 | 2021年2月1日 |
0.1.0 | 2020年11月30日 |
#183 in 性能分析
380KB
1.5K SLoC
CBDR
本仓库包含一组名为 cbdr
的工具。您可以按如下方式安装它
cargo install cbdr
用法
cbdr sample
以 name:program
的形式接受基准列表。它会随机选择一个基准,运行程序,报告执行时间,并循环。输出为CSV格式,持续输出。为了了解其外观,让我们通过 head
(限制输出) 和 column
(格式化输出)
$ cbdr sample "md5:md5sum $BIG_FILE" "sha1:sha1sum $BIG_FILE" "sha256:sha256sum $BIG_FILE" | head | column -ts,
Warming up md5...
Warming up sha1...
Warming up sha256...
benchmark sys_time user_time wall_time
md5 0.01 0.12 0.131099686
sha1 0.03 0.13 0.155063893
sha256 0.02 0.32 0.344348186
sha256 0.01 0.32 0.335235973
md5 0 0.13 0.128056813
md5 0.01 0.13 0.130115718
md5 0.02 0.1 0.131369468
sha1 0 0.15 0.149611563
md5 0.01 0.12 0.128339435
cbdr analyze
接收 cbdr sample
的输出,并总结基准之间的差异。
$ cbdr analyze <results.csv
md5 sha1 difference (99.9% CI)
sys_time 0.011 ± 0.007 0.011 ± 0.008 [ -14.7% .. +17.5%]
user_time 0.116 ± 0.009 0.138 ± 0.009 [ +17.0% .. +20.6%]
wall_time 0.128 ± 0.006 0.149 ± 0.006 [ +15.9% .. +18.0%]
samples 392 410
sha1 sha256 difference (99.9% CI)
sys_time 0.011 ± 0.008 0.012 ± 0.008 [ -12.0% .. +20.0%]
user_time 0.138 ± 0.009 0.334 ± 0.013 [+139.6% .. +143.4%]
wall_time 0.149 ± 0.006 0.345 ± 0.011 [+129.8% .. +132.5%]
samples 410 422
理解输出
让我们看看这一行
md5 sha1 difference (99.9% CI)
wall_time 0.128 ± 0.006 0.149 ± 0.006 [ +15.9% .. +18.0%]
因此,我们有一组“md5”的墙时测量值(让我们称这个集合为 X
)和一组“sha1”的墙时测量值(我们称它为 Y
)。
首先,我们获取这些集合的汇总统计信息
mean(X) = 0.128 秒
和std_dev(X) = 0.006 秒
mean(Y) = 0.149 秒
和std_dev(Y) = 0.006 秒
然后,我们估计均值之间的差异
置信区间[均值(Y) - 均值(X)] = [+0.02035秒, +0.02304秒]
但这是以第一个均值的百分比表示的
- `置信区间[mean(Y) - mean(X)] / mean(X) = [+0.159, +0.18]
所以你可以把“[+15.9% .. +18.0%]”理解为:如果你知道md5平均运行所需时间,那么为了得到sha1的平均运行时间,你需要额外加上一个百分比x%,其中x的值在15.9%到18%之间。
沟通结果
让我们看看比较md5和sha1的表格。根据墙钟时间来看,sha1看起来比md5慢了大约17%,不是吗?所以我们就告诉我们的同事
我对比了sha1和md5,发现它慢了17%。
这很好,但如果我们报告置信区间会更好!
根据墙钟时间,sha1比md5慢16-18%(α=99.9%)。
现在我们的同事对基准测试有多好有了些了解。注意我们如何也报告了α值。《code>cbdr analyze允许你使用--significance
选项自定义此参数,但默认为99.9%。
现在让我们比较md5sum和sha1sum在内核中花费的时间。差异在-15%到+18%之间。这个区间相当宽(意味着有很大的方差),而且还跨越了0%。这意味着没有足够的证据来断定有真正的差异。
系统时间差异在噪声范围内(α=99.9%)
记住,孩子们:在传达基准测试结果时要练习统计责任感!
高级功能
你可以直接将cbdr sample
的输出管道连接到cbdr analyze
,以实时查看置信区间随着新数据的更新而变化。
$ cbdr sample --timeout=30s [benchmarks] | cbdr analyze
(注意:开始基准测试,观察结果,然后当你认为已经收集到足够的数据时按ctrl-C是很诱人的。如果你这样做,结果偏向的风险非常高。在开始基准测试之前决定你的停止点!)
如果你的命令行很长,你可能发现按行写入并传递给xargs更方便。
$ xargs cbdr sample >results.csv <<EOF
"md5: md5sum $BIG_FILE"
"sha1: sha1sum $BIG_FILE"
"sha256: sha256sum $BIG_FILE"
EOF
cbdr plot
生成用于可视化基准测试结果的vega-lite规范。
$ cbdr plot <results.csv | vl2png | feh -
这有助于了解你的结果有多高斯。
自定义测量
cbdr
可以利用自定义测量脚本。例如,bench_helpers/中的一个脚本调用“perf stat”以获取一些更复杂的度量
./bench_helpers/perf-bench.sh 'git ls-files'
{
"task_clock": 4.90,
"cpu_utilization": 0.600,
"context_switches": 1,
"cpu_migrations": 0,
"page_faults": 164,
"cycles": 3875762,
"instructions": 3859594,
"branches": 881081,
"branch_misses": 19461
}
你可以使用-b
标志告诉cbdr
使用这样的脚本
% cbdr sample -b bench_helpers/perf-bench.sh find 'git ls-files' | cbdr analyze
Warming up find...
Warming up git ls-files...
find git ls-files difference (99.9% CI)
branch_misses 126177.219 ± 4491.457 18969.948 ± 309.242 [ -85.3% .. -84.6%]
branches 7124422.062 ± 10084.975 880096.793 ± 4663.410 [ -87.7% .. -87.6%]
context_switches 1.096 ± 1.557 0.117 ± 0.356 [-103.3% .. -75.4%]
cpu_migrations 0.003 ± 0.058 0.000 ± 0.000 [ NaN% .. NaN%]
cpu_utilization 0.947 ± 0.010 0.654 ± 0.022 [ -31.2% .. -30.7%]
cycles 44041299.653 ± 979069.887 4108837.580 ± 190263.302 [ -90.9% .. -90.5%]
instructions 36138254.480 ± 59172.510 3854234.597 ± 24108.835 [ -89.4% .. -89.3%]
page_faults 146.617 ± 2.193 164.714 ± 1.883 [ +12.2% .. +12.5%]
task_clock 14.901 ± 3.714 1.434 ± 0.560 [ -92.8% .. -88.0%]
samples 1189 1268
依赖关系
~9–19MB
~232K SLoC