Chtěl bych ve skriptu udělat následující:
start_time=date
a to po spuštění procesu nebo procesů:
end_time=date
a proveďte toto:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Jak bych to udělal?
Komentáře
-
/usr/bin/time your_script
… - Související: stackoverflow.com/q/8903239/6843677
Odpověď
Použijte čas od epochy ke snadné identifikaci rozpětí času ve skriptu
man date %s seconds since 1970-01-01 00:00:00 UTC %N nanoseconds (000000000..999999999)
.
start_time="$(date -u +%s)" sleep 5 end_time="$(date -u +%s)" elapsed="$(($end_time-$start_time))" echo "Total of $elapsed seconds elapsed for process" Total of 5 seconds elapsed for process
Bash nepodporuje čísla s plovoucí desetinnou čárkou, takže pro porovnání časů jako je třeba bc musíte použít externí nástroj 1475705058.042270582-1475705053.040524971
start_time="$(date -u +%s.%N)" sleep 5 end_time="$(date -u +%s.%N)" elapsed="$(bc <<<"$end_time-$start_time")" echo "Total of $elapsed seconds elapsed for process" Total of 5.001884264 seconds elapsed for process
Komentáře
Odpověď
bash má proměnná vestavěného časovače
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Komentáře
- Nebo
SECONDS=0; ...; echo "$SECONDS"
. Pozor však na tuto chybu .
Odpovědět
@jasonwryan to již navrhl, ale hodím to jako odpověď, protože to je také můj go-to, když chci načasovat skript. Načasování myscript jednoduše použijte:
time myscript
Komentáře
- Z času na čas to zkusím, ale tohle je více, když potřebuji izolovat nebo časové podsekce mého skriptu.
- To není užitečné, pokud chcete použít odvozený uplynulý čas v samotném skriptu, např. k výpočtu, kolik jednotek byl skript schopen zpracovat za sekundu .
Odpověď
Líbí se mi odpověď od @Miata, protože upozorňuje na date +%s
řešení. @Miata však obsahuje .%N
, ale nejsem si jistý, jakou výhodu získáte při pohledu na nanosekundy, když budou náklady na provedení date
příkaz v subshell. V praxi by tedy date +%s
mělo stačit. Další věc, kterou je třeba poznamenat, je date +%s
epocha 1970-01-01 00:00:00 UTC. Což znamená, že čas má absolutní epochu a měření času můžete sdílet mezi různými instancemi shell skriptu nebo různými stroji.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Líbí se mi @glenn jackman “ s odpovědí, protože odkazuje na SECONDS
vestavěnou proměnnou bash. Je třeba si uvědomit, že epocha je čas, kdy byl proces spuštěn. Tuto techniku tedy můžeme použít pouze k změřte časy věcí, které se v daném skriptu stanou:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Další věcí je, že všechny své úkoly vložím do (( ))
příkaz. tj. můžete přepsat:
cmd=$(( some_expression ))
jako
(( cmd=some_expression ))
Tímto způsobem , můžeme minimalizovat výskyt $
symbolu.
date '+%s.%N'
date -u
, abyste předešli DST a místním problémům s příkazem. přečtěte si tuto odpověďelapsed=$(dc -e "$end_time $start_time - p")