V dnešní době, imo, není důvod používat time
pro účely benchmarkingu. Použijte perf stat
namísto. Poskytuje vám mnohem užitečnější informace a může opakovat proces srovnávání libovolně zadaný čas a provádět statistiky výsledků, tj. vypočítat rozptyl a střední hodnotu. To je mnohem spolehlivější a stejně snadné použití jako time
:
perf stat -r 10 -d <your app and arguments>
-r 10
spustí vaši aplikaci 10krát a provede statistiku. -d
vygeneruje další data, jako například chybějící mezipaměť.
Takže zatímco time
může být dostatečně spolehlivý pro dlouhotrvající aplikace, rozhodně není tak spolehlivý jako perf stat
. Použijte místo toho to.
Dodatek: Pokud opravdu chcete nadále používat time
, alespoň nepoužívejte příkaz bash-builtin, ale skutečný obchod v podrobném režimu:
/usr/bin/time -v <some command with arguments>
Výstupem je pak např.:
Command being timed: "ls"
User time (seconds): 0.00
System time (seconds): 0.00
Percent of CPU this job got: 0%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
Average shared text size (kbytes): 0
Average unshared data size (kbytes): 0
Average stack size (kbytes): 0
Average total size (kbytes): 0
Maximum resident set size (kbytes): 1968
Average resident set size (kbytes): 0
Major (requiring I/O) page faults: 0
Minor (reclaiming a frame) page faults: 93
Voluntary context switches: 1
Involuntary context switches: 2
Swaps: 0
File system inputs: 8
File system outputs: 0
Socket messages sent: 0
Socket messages received: 0
Signals delivered: 0
Page size (bytes): 4096
Exit status: 0
Zvláště si všimněte, jak je to schopné měřit vrchol RSS, což často stačí, pokud chcete porovnat účinek opravy na špičkovou spotřebu paměti. Tj. použijte tuto hodnotu k porovnání před/po a pokud dojde k výraznému poklesu maxima RSS, pak jste udělali něco správně.
time
produkuje dostatečně dobré časy pro benchmarky, které trvají déle než jednu sekundu, jinak to trvalo exec()
proces může být ve srovnání s jeho dobou běhu velký.
Při srovnávání byste si však měli dávat pozor na přepínání kontextu. To znamená, že jiný proces může používat CPU, čímž soupeří o CPU s vaším benchmarkem a zvyšuje jeho dobu běhu. Abyste se vyhnuli sporům s jinými procesy, měli byste spustit benchmark takto:
sudo chrt -f 99 /usr/bin/time --verbose <benchmark>
Nebo
sudo chrt -f 99 perf stat -ddd <benchmark>
sudo chrt -f 99
spouští váš benchmark ve třídě FIFO v reálném čase s prioritou 99, díky čemuž má váš proces nejvyšší prioritu a zabraňuje přepínání kontextu (můžete změnit /etc/security/limits.conf
takže nevyžaduje privilegovaný proces pro použití priorit v reálném čase).
To také dělá time
nahlaste všechny dostupné statistiky, včetně počtu kontextových přepnutí, ke kterým došlo ve vašem benchmarku, což by normálně mělo být 0, jinak možná budete chtít benchmark spustit znovu.
perf stat -ddd
je ještě informativnější než /usr/bin/time
a zobrazuje takové informace, jako jsou instrukce za cyklus, chybějící větve a mezipaměti atd.
A je lepší deaktivovat škálování a zesílení frekvence CPU, aby frekvence CPU zůstala během benchmarku konstantní, abyste získali konzistentní výsledky.