hyperfine
一个命令行基准测试工具。
赞助商
特别感谢我们最大的赞助商:
持续基准测试:在CI中捕获性能回归
使用Bencher随时间跟踪您的hyperfine
基准测试结果。
在性能回归进入生产环境之前检测并防止它们。
功能
- 多次运行的统计分析。
- 支持任意shell命令。
- 关于基准测试进度和当前估计的持续反馈。
- 可以在实际基准测试之前执行预热运行。
- 可以在每次计时运行之前设置清除缓存的命令。
- 统计异常值检测,以检测其他程序的干扰和缓存效应。
- 将结果导出为各种格式:CSV、JSON、Markdown、AsciiDoc。
- 参数化基准测试(例如,改变线程数)。
- 跨平台
使用方法
基本基准测试
要运行基准测试,您只需调用hyperfine <command>...
。参数可以是任何shell命令。例如:
hyperfine 'sleep 0.3'
Hyperfine将自动确定为每个命令执行的运行次数。默认情况下,它将执行至少10次基准测试运行,并测量至少3秒。要更改此设置,您可以使用-r
/--runs
选项:
hyperfine --runs 5 'sleep 0.3'
如果您想比较不同程序的运行时间,可以传递多个命令:
hyperfine 'hexdump file' 'xxd file'
预热运行和准备命令
对于执行大量磁盘I/O的程序,基准测试结果可能会受到磁盘缓存以及它们是冷还是热的影响。
如果您想在热缓存上运行基准测试,可以使用-w
/--warmup
选项在实际基准测试之前执行一定次数的程序执行:
hyperfine --warmup 3 'grep -R TODO *'
相反,如果您想在冷缓存上运行基准测试,可以使用-p
/--prepare
选项在每次计时运行之前运行特殊命令。例如,要在Linux上清除硬盘缓存,您可以运行
sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
要在hyperfine中使用这个特定命令,请调用sudo -v
临时获取sudo权限,然后调用:
hyperfine --prepare 'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' 'grep -R TODO *'
参数化基准测试
如果您想运行一系列基准测试,其中单个参数变化(比如线程数),您可以使用-P
/--parameter-scan
选项并调用:
hyperfine --prepare 'make clean' --parameter-scan num_threads 1 12 'make -j {num_threads}'
这也适用于小数。-D
/--parameter-step-size
选项可用于控制步长:
hyperfine --parameter-scan delay 0.3 0.7 -D 0.2 'sleep {delay}'
这将运行sleep 0.3
、sleep 0.5
和sleep 0.7
。
对于非数字参数,您还可以使用-L
/--parameter-list
选项提供值列表:
hyperfine -L compiler gcc,clang '{compiler} -O2 main.cpp'
中间shell
默认情况下,命令使用预定义的shell执行(Unix上为/bin/sh
,Windows上为cmd.exe
)。
如果您想使用不同的shell,可以使用-S, --shell <SHELL>
选项:
hyperfine --shell zsh 'for i in {1..10000}; do echo test; done'
请注意,hyperfine始终校正shell启动时间。为此,它执行一个校准程序,在其中运行带有空命令的shell(多次),以测量shell的启动时间。然后它会从总时间中减去这个时间,以显示实际命令所使用的时间。
如果您想不使用中间shell运行基准测试,可以使用-N
或--shell=none
选项。这对于非常快的命令(< 5毫秒)很有帮助,因为在这种情况下,shell启动开销校正会产生显著的噪音。请注意,在这种情况下,您不能使用shell语法,如*
或~
。
hyperfine -N 'grep TODO /home/user'
Shell函数和别名
如果您使用的是bash,可以导出shell函数以直接用hyperfine对它们进行基准测试:
my_function() { sleep 1; }
export -f my_function
hyperfine --shell=bash my_function
否则,将它们内联到基准测试程序中或从中源引:
hyperfine 'my_function() { sleep 1; }; my_function'
echo 'alias my_alias="sleep 1"' > /tmp/my_alias.sh
hyperfine '. /tmp/my_alias.sh; my_alias'
导出结果
Hyperfine有多个选项可以将基准测试结果导出为CSV、JSON、Markdown和其他格式(详见--help
文本)。
Markdown
您可以使用--export-markdown <file>
选项创建如下表格:
命令 | 平均值 [秒] | 最小值 [秒] | 最大值 [秒] | 相对值 |
---|---|---|---|---|
find . -iregex '.*[0-9]\.jpg$' | 2.275 ± 0.046 | 2.243 | 2.397 | 9.79 ± 0.22 |
find . -iname '*[0-9].jpg' | 1.427 ± 0.026 | 1.405 | 1.468 | 6.14 ± 0.13 |
fd -HI '.*[0-9]\.jpg$' | 0.232 ± 0.002 | 0.230 | 0.236 | 1.00 |
JSON
如果你想更详细地分析基准测试结果,JSON输出会很有用。scripts/
文件夹包含了许多有用的Python程序,可以进一步分析基准测试结果并创建有用的可视化,如运行时间的直方图或用于比较多个基准测试的箱线图:
详细基准测试流程图
以下图表解释了使用--warmup
、--prepare <cmd>
、--setup <cmd>
或--cleanup <cmd>
等选项时各种计时运行的执行顺序:
安装
在Ubuntu上
从发布页面下载适当的.deb
包,并通过dpkg
安装:
wget https://github.com/sharkdp/hyperfine/releases/download/v1.16.1/hyperfine_1.16.1_amd64.deb
sudo dpkg -i hyperfine_1.16.1_amd64.deb
在Fedora上
在Fedora上,可以从官方仓库安装hyperfine:
dnf install hyperfine
在Alpine Linux上
在Alpine Linux上,可以从官方仓库安装hyperfine:
apk add hyperfine
在Arch Linux上
在Arch Linux上,可以从官方仓库安装hyperfine:
pacman -S hyperfine
在Debian Linux上
在Debian Linux上,可以从测试仓库安装hyperfine:
apt install hyperfine
在Exherbo Linux上
在Exherbo Linux上,可以从rust仓库安装hyperfine:
cave resolve -x repository/rust
cave resolve -x hyperfine
在Funtoo Linux上
在Funtoo Linux上,可以从core-kit安装hyperfine:
emerge app-benchmarks/hyperfine
在NixOS上
在NixOS上,可以从官方仓库安装hyperfine:
nix-env -i hyperfine
在Flox上
在Flox上,可以按以下方式安装hyperfine:
flox install hyperfine
Flox中的Hyperfine版本跟随Nix的版本。
在openSUSE上
在openSUSE上,可以从官方仓库安装hyperfine:
zypper install hyperfine
在Void Linux上
可以通过xbps安装Hyperfine
xbps-install -S hyperfine
在macOS上
可以通过Homebrew安装Hyperfine:
brew install hyperfine
或者你可以使用MacPorts安装:
sudo port selfupdate
sudo port install hyperfine
在FreeBSD上
可以通过pkg安装Hyperfine:
pkg install hyperfine
在OpenBSD上
doas pkg_add hyperfine
在Windows上
可以通过Chocolatey、Scoop或Winget安装Hyperfine:
choco install hyperfine
scoop install hyperfine
winget install hyperfine
使用conda
可以通过conda
从conda-forge
频道安装Hyperfine:
conda install -c conda-forge hyperfine
使用cargo(Linux、macOS、Windows)
可以通过cargo从源代码安装Hyperfine:
cargo install --locked hyperfine
确保使用Rust 1.70或更新版本。
从二进制文件(Linux、macOS、Windows)
从发布页面下载相应的归档文件。
替代工具
Hyperfine的灵感来自bench。
与其他工具的集成
Chronologer是一个使用hyperfine
来可视化Git历史中基准测试时间变化的工具。
Bencher是一个支持hyperfine
的持续基准测试工具,用于在CI中跟踪基准测试并捕捉性能回归。
请务必查看此仓库中的scripts
文件夹,其中包含了一系列用于处理hyperfine
基准测试结果的工具。
名称的由来
hyperfine 这个名称的选择是参考了铯-133的超精细能级,它在我们时间基本单位的定义——秒的定义中起着至关重要的作用。
引用 hyperfine
感谢您考虑在您的研究工作中引用 hyperfine。请参阅侧边栏中的信息,了解如何正确引用 hyperfine。
许可证
hyperfine
采用 MIT 许可证和 Apache 许可证 2.0 的双重许可。
有关详细信息,请参阅 LICENSE-APACHE 和 LICENSE-MIT 文件。