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 samplename: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.128std_dev(X) = 0.006
  • mean(Y) = 0.149std_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