国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

hyperfine 使用指南

2023-03-20 21:28 作者:限量版范兒  | 我要投稿

hyperfine 使用指南

簡介

測量程序運行耗時是一個常見的需求。

我們經(jīng)常會調(diào)整自己編寫的程序,來給程序加速。但是自己提出的加速計劃,不一定會被
機(jī)器認(rèn)可。比如,你覺得?++i?比?i++?更快并且花了兩天時間把程序里所有的后綴全
改成了前綴,但是機(jī)器不管,她編譯的時候直接把你的寫法給揚(yáng)掉了。這個時候再在 git
的提交信息里寫?perf: 優(yōu)化 XX 部分性能?就會顯得非?;?。所以,我們經(jīng)常需要對
程序性能測試來保證自己的優(yōu)化是有效的。對程序性能測試的最常用的方法就是計時。

小時候幼兒園的老師經(jīng)常教育我們,在?bash?里面用?time?的命令就可以測量程序
運行的時間。這也是大家最常用的方法。但是我們都知道,time?是一個非常粗糙的工
具。用它測量程序性能時,總會遇到這么幾個問題:

  • 測量出來的時間真的是準(zhǔn)的嗎?會不會受到系統(tǒng)波動的影響?

  • 測量出來的時間有多可靠?該怎么知道測量誤差?

  • 我能比較輕松地對比兩個或多個程序的性能嗎?

我們可以通過寫一堆土制腳本來解決上述問題,但是與其費心寫功能不全、漏洞百出的腳
本,還不如直接使用已有的趁手工具。

hyperfine?就是一個優(yōu)秀的性能測試工具。

優(yōu)勢

根據(jù) hyperfine 自己的?介紹?,hyperfine 擁有如下功能:

  • 多次測量并統(tǒng)計均值方差

  • 支持任意 shell 命令

  • 進(jìn)度條和預(yù)估剩余時間

  • 預(yù)熱:正式測試之前先運行幾次

  • 測試之前執(zhí)行指定命令(可用于清除緩存)

  • 自動發(fā)現(xiàn) cache 影響和系統(tǒng)性能波動影響

  • 多種輸出格式,支持 CSV、JSON、Markdown 等等

  • 跨平臺

(注:hyperfine 的介紹是有?中文翻譯?的,但是我看的時候它略微有些過時了。
希望有好心人來更新一下翻譯)

它的使用截圖如下:

個人評測:life-changing 的好東西,我現(xiàn)在沒有 hyperfine 都不會測程序了。

基本使用

hyperfine 的使用方式非常符合直覺,命令行結(jié)構(gòu)和選項設(shè)計得很好。

安裝

hyperfine 是用?rust?寫的(不打算去學(xué)一下?)。如果機(jī)器上有 rust 開發(fā)環(huán)境,
直接運行?cargo install hyperfine?即可完成安裝。cargo?是 rust 的編譯系統(tǒng)
和依賴管理工具。

如果機(jī)器上沒有 rust 開發(fā)環(huán)境,可以求助你的包管理器,或者從
hyperfine 在 Github 上的發(fā)布頁面?中,下載與自己的機(jī)器架構(gòu)對應(yīng)的二進(jìn)制
文件。

測試單個程序

命令:

hyperfine 'hexdump file'

結(jié)果:

11:17 jyi-station ~/tmp/bgifile 0 hyperfine 'hexdump test13.c' Benchmark 1: hexdump test13.c ?Time (mean ± σ): ? ? 385.0 ms ± ? 5.1 ms ? ?[User: 383.0 ms, System: 2.1 ms] ?Range (min … max): ? 381.6 ms … 398.9 ms ? ?10 runs

從結(jié)果可以看出,hyperfine 把程序運行了 10 次。測量出來平均耗時是 385 ms,誤差
是 5.1 ms。運行的時候,hyperfine 把程序的所有輸出重定向到了?/dev/null?里,所
以終端上沒有多余的內(nèi)容。

你看,我?guī)缀跏裁炊紱]做,只是把命令提供給 hyperfine,她就自動幫忙把所有東西都測
好了!

我們甚至無需檢查誤差是否過大,因為 hyperfine 會自動檢測誤差過大的情況,并且根
據(jù)程序運行時間的特征來猜測可能發(fā)生了什么問題,并給出一些建議。非常貼心。后面會
詳細(xì)討論這些細(xì)節(jié)。

對比測試多個程序

命令:

hyperfine 'hexdump test13.c' 'xxd test13.c' 'xxd test14.c'

結(jié)果:

11:24 jyi-station ~/tmp/bgifile 0 hyperfine 'hexdump test13.c' 'xxd test13.c' 'xxd test14.c' Benchmark 1: hexdump test13.c ?Time (mean ± σ): ? ? 383.6 ms ± ? 1.9 ms ? ?[User: 381.8 ms, System: 1.6 ms] ?Range (min … max): ? 381.6 ms … 387.7 ms ? ?10 runs Benchmark 2: xxd test13.c ?Time (mean ± σ): ? ? ?90.2 ms ± ? 1.0 ms ? ?[User: 88.4 ms, System: 1.9 ms] ?Range (min … max): ? ?88.7 ms … ?93.4 ms ? ?32 runs Benchmark 3: xxd test14.c ?Time (mean ± σ): ? ? 180.2 ms ± ? 2.8 ms ? ?[User: 176.8 ms, System: 3.2 ms] ?Range (min … max): ? 177.1 ms … 186.6 ms ? ?16 runs Summary ?'xxd test13.c' ran ? ?2.00 ± 0.04 times faster than 'xxd test14.c' ? ?4.25 ± 0.05 times faster than 'hexdump test13.c'

在這個例子里,我們給了 hyperfine 三個參數(shù),讓她測量三個程序的耗時。hyperfine
首先輸出了三個程序各自的運行結(jié)果,這部分和測試單個程序時的結(jié)果差不多。但是在報
告的最后,hyperfine 還額外給出了一些信息。她指出了跑的最快的程序(港記程序 ??)
,并且顯示了其相對其他程序的加速比和誤差。

我們一般測試程序時只需要關(guān)注最后的 “Summary” 一欄,知道哪個更快、快多少就可以
了。前面幾行是和別人吵架時,給他們看測試結(jié)果讓他們閉嘴時用的。

運行原理

對每個程序,hyperfine 會把它運行 10 次(運行次數(shù)有選項可以配置)。hyperfine 會
對運行時間計時,并且求出均值和標(biāo)準(zhǔn)差。

每次運行的時候,hyperfine 會運行一個 shell 來執(zhí)行這些程序。比如,假定程序
是?sleep 1,那么 hyperfine 實際運行的是?sh -c 'sleep 1'。這種用 shell 來運
行程序的行為,會導(dǎo)致程序運行時間測量結(jié)果偏大;但是如果不用 shell 來運行程序,
大家平時習(xí)慣的?~/?和?*.txt?這些便利縮寫就不能用了,非常麻煩。

總之,這種使用 shell 來執(zhí)行參數(shù)的設(shè)計,算是便利與準(zhǔn)確之間的一種折衷。

為了使測量結(jié)果更精確,你可以手動禁止 hyperfine 使用 shell 來執(zhí)行程序的行為。
hyperfine 本身也會檢測 shell 對測量結(jié)果的影響,并且在她覺得 shell 對測量結(jié)果的
影響已經(jīng)大到不可忽略時提出警告。判定規(guī)則與細(xì)節(jié)將在之后描述。

使用進(jìn)階

現(xiàn)在,你已經(jīng)基本學(xué)會用 hyperfine 了!讓我們來看看一些更好玩的東西吧。

測試 IO 密集型程序

假設(shè)我們要運行一個大量讀寫磁盤文件的程序 10 次,我們會發(fā)現(xiàn)什么怪現(xiàn)象呢?我們
會發(fā)現(xiàn),第一次或前幾次運行所花費的時間會顯著大于后面幾次。這是由于 Linux 系統(tǒng)
有 Page Cache 的機(jī)制,它會盡可能努力地把最近使用過的文件緩存在內(nèi)存里。

在第一次運行的時候,程序試圖讀文件。操作系統(tǒng)發(fā)現(xiàn)內(nèi)存里沒有相關(guān)文件,只好老老實
實地從磁盤上把文件讀出來再交給程序。但是緊接著程序運行第二三四次,程序試圖讀文
件時,操作系統(tǒng)發(fā)現(xiàn)文件剛剛才被讀過,還被緩存在內(nèi)存里,于是直接把內(nèi)存中的內(nèi)容交
給程序,直接省略掉了讀盤的過程。眾所周知,內(nèi)存的讀寫速度一般遠(yuǎn)大于硬盤。這導(dǎo)致
了第二三四次運行程序時,程序用時會顯著少于第一次。

類似的情況還會出現(xiàn)在很多具有緩存機(jī)制的系統(tǒng)(沒有特指操作系統(tǒng)?。├?。在對于這些
系統(tǒng)打交道的程序計時時,我們需要給 hyperfine 加一些參數(shù)。

預(yù)熱

我們可以使用?--warmup N?的參數(shù)讓程序被真正計時之前,先運行 N 次,其中 N 是一
個整數(shù)。比如,hyperfine --warmup 2 sleep 3?這個命令實際上會運行?sleep 3?這
個命令 12 次,其中最后 10 次會被計時。

這種方式有利于將程序需要用到的東西提前裝到緩存里。可以測量程序在緩存工作良好時
的運行效率。

提前執(zhí)行指令

我們可以使用?--prepare X?的參數(shù)讓 hyperfine 每次運行程序之前,先運行一下 X,
其中 X 是一條 shell 命令。比如,
hyperfine --prepare 'echo 3 | sudo tee /proc/sys/vm/drop_caches' sleep 3
這個命令,會運行?sleep 3?10 次,但是每次運行前,會運行
echo 3 | sudo tee /proc/sys/vm/drop_caches?一次,來清除 Linux 的 Page Cache。

這種方式直接讓緩存沒用了??梢詼y量程序冷啟動的速度。

測試運行時間過短的程序

之前說到,hyperfine 會用一個 shell 來執(zhí)行待計時的程序。但是如果程序跑得很快,
導(dǎo)致 shell 啟動、解析、執(zhí)行的時間已經(jīng)占總用時不小的一部分了,那么測量誤差就會
變得不可接受。

這個時候我們就可以使用?-N?參數(shù)來制止 hyperfine 使用 shell。此時,她會用一個
內(nèi)置的簡陋的解析器來把命令的可執(zhí)行文件和參數(shù)給分開。這個簡陋的解析器主要使用
空白字符來分割參數(shù),但是也支持基礎(chǔ)的轉(zhuǎn)義字符和引號。

比如:

hyperfine -N 'touch x'

不知道自己的程序?qū)儆谀姆N類型?

有笨比……

如果你不知道你的程序要跑多久,也不知道它是不是要用到某種緩存系統(tǒng),直接把它當(dāng)成
純計算的程序來測就行了。hyperfine 會在發(fā)現(xiàn)不對勁時來提醒你。

下面是幾個例子:

奇怪的測量結(jié)果

20:21 jyi-station ~/tmp/bgifile 0 hyperfine 'cat test18.c' Benchmark 1: cat test18.c ?Time (mean ± σ): ? ? ?16.9 ms ± ? 1.0 ms ? ?[User: 1.1 ms, System: 15.9 ms] ?Range (min … max): ? ?15.7 ms … ?22.1 ms ? ?154 runs ?Warning: Statistical outliers were detected. Consider re-running this ?benchmark on a quiet system without any interferences from other programs. ?It might help to use the '--warmup' or '--prepare' options.

hyperfine 發(fā)現(xiàn)測試的時候,有些數(shù)據(jù)與別的明顯不在一個等級。所以她警告你并且建議
你在系統(tǒng)閑的時候重跑。

初次測量很慢

20:21 jyi-station ~/tmp/bgifile 0 hyperfine 'cat test19.c' Benchmark 1: cat test19.c ?Time (mean ± σ): ? ? ?34.3 ms ± ?14.1 ms ? ?[User: 2.2 ms, System: 31.8 ms] ?Range (min … max): ? ?30.4 ms … 105.4 ms ? ?28 runs ?Warning: The first benchmarking run for this command was significantly slower ?than the rest (105.4 ms). This could be caused by (filesystem) caches that ?were not filled until after the first run. You should consider using the ?'--warmup' option to fill those caches before the actual benchmark. ?Alternatively, use the '--prepare' option to clear the caches before each ?timing run.

這次 hyperfine 不僅發(fā)現(xiàn)數(shù)據(jù)異常,還發(fā)現(xiàn)是第一次跑的時候數(shù)據(jù)異常。于是她猜測是
某種神秘的緩存系統(tǒng)起了作用,并且建議你用?--warmup?參數(shù)或?--prepare?參數(shù)來
消除緩存的影響。

程序跑得很快

20:21 jyi-station ~/tmp/bgifile 0 hyperfine 'cat test1.c' Benchmark 1: cat test1.c ?Time (mean ± σ): ? ? ? 0.9 ms ± ? 0.1 ms ? ?[User: 0.7 ms, System: 0.4 ms] ?Range (min … max): ? ? 0.7 ms … ? 1.3 ms ? ?1340 runs ?Warning: Command took less than 5 ms to complete. Note that the results ?might be inaccurate because hyperfine can not calibrate the shell startup ?time much more precise than this limit. You can try to use the ?`-N`/`--shell=none` option to disable the shell completely.

這次,hyperfine 發(fā)現(xiàn)程序跑得很快,誤差會比較大,并且建議你用?-N?參數(shù)來直接運行程序,
繞過啟動 shell 的步驟。

額外的功能

除此之外,hyperfine 還有一些別的功能,比如參數(shù)化測試之類的東西。不過我感覺要參
數(shù)化的話與其用這一坨命令行參數(shù),不如去寫一個小小腳本……所以我沒用過。如果有人感
興趣的話可以試試。

改變輸出格式以便與其他軟件協(xié)作

hyperfine 的命令行界面很好看,有進(jìn)度條還有顏色。在除命令行之外的地方,她也做得
很好。比如,hyperfine 可以直接用?--export-markdown?參數(shù)生成 markdown 表格,
接著你就可以直接把結(jié)果插進(jìn) README 里面。她還可以導(dǎo)出 json 格式的測試結(jié)果,方便
之后再用腳本處理,做些可視化什么的(hyperfine 的倉庫就附帶了許多可視化腳本,很
好玩)。

總結(jié)

測量程序性能的方式有很多。相比那些在函數(shù)調(diào)用上插樁(gprof)或讀 PMC 寄存器
(perf)的東西來說,單純的計時也許太簡陋了一些。但是第一次參觀 profiler,卻并
不覺得震撼。因為我早已遇見,獨屬于我的 benchmarking tool。初遇你的那天起,齒輪
便開始轉(zhuǎn)動,卻無法阻止喪失的預(yù)感。盡管已經(jīng)擁有了很多,但讓我們再多加一個吧。
可以給我最后一個加速比嗎?我不愿遺忘

文章標(biāo)題:hyperfine 使用指南
文章鏈接:https://www.dianjilingqu.com/697927.html

hyperfine 使用指南的評論 (共 條)

分享到微博請遵守國家法律
临猗县| 同江市| 库伦旗| 洪雅县| 普宁市| 汝阳县| 凌源市| 盐池县| 莲花县| 图片| 仁怀市| 治多县| 米林县| 郓城县| 繁峙县| 旺苍县| 牡丹江市| 古浪县| 德兴市| 视频| 鄱阳县| 柘城县| 通道| 介休市| 宜州市| 沧州市| 彭泽县| 元阳县| 土默特左旗| 兴隆县| 弋阳县| 沐川县| 清苑县| 赤壁市| 博客| 绥棱县| 宜城市| 贵州省| 阿坝| 古交市| 海安县|