Chciałbym w pewnym momencie wykonać następujące czynności w skrypcie:
start_time=date
i to po uruchomieniu procesu lub procesów:
end_time=date
a następnie zrób to:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Jak mam to zrobić?
Komentarze
-
/usr/bin/time your_script
… - Powiązane: stackoverflow.com/q/8903239/6843677
Odpowiedź
Wykorzystaj czas, jaki upłynął od epoki, aby łatwo zidentyfikować przedział czasu w skrypcie
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 nie obsługuje liczb zmiennoprzecinkowych, więc będziesz musiał użyć zewnętrznego narzędzia, takiego jak bc, aby porównać czasy, takie jak 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
Komentarze
Odpowiedź
bash ma wbudowana zmienna timera
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Komentarze
- Lub . Uważaj jednak na ten błąd .
Odpowiedź
@jasonwryan już to zasugerował, ale wrzucę to jako odpowiedź, ponieważ jest to również mój punkt wyjścia, gdy chcę określić czas skryptu. Aby określić czas mój skrypt , po prostu użyj:
time myscript
Komentarze
- Spróbuję tego od czasu do czasu, ale jest to bardziej przydatne, gdy muszę izolacja lub podsekcja czasu mojego skryptu ..
- Nie jest to przydatne, jeśli chcesz użyć wyprowadzonego czasu, który upłynął w samym skrypcie, np. aby obliczyć, ile jednostek skrypt był w stanie przetworzyć na sekundę .
Odpowiedź
Podoba mi się odpowiedź @Miata „, ponieważ zwraca uwagę na date +%s
rozwiązanie. Jednak @Miata zawiera .%N
, ale nie jestem pewien, jaką korzyść odniesiesz, patrząc na nanosekundy, gdy występuje koszt wykonania date
polecenie w podpowłoce. Dlatego w praktyce date +%s
powinno wystarczyć. Inną rzeczą, na którą należy zwrócić uwagę, jest date +%s
epoka to 1970-01-01 00:00:00 UTC. Co oznacza, że czas ma absolutną epokę i możesz dzielić pomiar czasu między różnymi instancjami skryptu powłoki lub różnymi maszynami.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Lubię @glenn jackman ” odpowiedź, ponieważ odnosi się do wbudowanej zmiennej bash SECONDS
. Należy tu zwrócić uwagę na to, że epoka to czas rozpoczęcia procesu. Możemy więc użyć tej techniki tylko do mierzyć czas dla rzeczy, które dzieją się w tym skrypcie:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Inną rzeczą jest to, że umieszczam wszystkie moje zadania w (( ))
polecenie. tzn. możesz przepisać:
cmd=$(( some_expression ))
jako
(( cmd=some_expression ))
Robiąc to , możemy zminimalizować występowanie symbolu $
.
date '+%s.%N'
date -u
, aby uniknąć czasu letniego i lokalnych problemów z poleceniem. Proszę przeczytaj tę odpowiedźelapsed=$(dc -e "$end_time $start_time - p")