Aș dori să fac următoarele la un moment dat într-un script:
start_time=date
și aceasta după ce un proces sau procese au rulat:
end_time=date
și apoi faceți acest lucru:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Cum aș face asta?
Comentarii
-
/usr/bin/time your_script
… - În legătură: stackoverflow.com/q/8903239/6843677
Răspuns
Folosiți timpul de la epocă pentru a identifica cu ușurință un interval de timp într-un script
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 nu acceptă numerele cu virgulă mobilă, așa că va trebui să utilizați un instrument extern precum bc pentru a compara timpi precum 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
Comentarii
Răspuns
bash are un variabilă de timer încorporat
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Comentarii
- Sau
SECONDS=0; ...; echo "$SECONDS"
. Ferește-te de acea eroare .
Răspunde
@jasonwryan l-a sugerat deja, dar îl voi arunca ca răspuns, deoarece este, de asemenea, accesul meu atunci când vreau să cronometrez un script. Pentru a sincroniza myscript pur și simplu folosiți:
time myscript
Comentarii
- Voi încerca asta din când în când, dar asta este mai mult pentru când trebuie să izolați sau sub-secțiunile de timp ale scriptului meu ..
- Acest lucru nu este util dacă doriți să utilizați timpul scurs derivat în cadrul script-ului în sine, de exemplu, pentru a calcula câte unități a putut procesa scriptul pe secundă .
Răspuns
Îmi place răspunsul @Miata „, deoarece atrage atenția asupra date +%s
soluție. Cu toate acestea, @Miata include .%N
, dar nu sunt sigur ce beneficii veți obține la nanosecunde atunci când există costul executării date
comandă într-o sub-coajă. Deci, în practică, date +%s
ar trebui să fie suficient. Celălalt lucru de remarcat este date +%s
epoca este 1970-01-01 00:00:00 UTC. Ceea ce înseamnă că timpul are o epocă absolută și puteți împărtăși măsurarea timpului între diferite instanțe de script shell sau diferite mașini.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Îmi place @glenn jackman ” Răspunsul s, deoarece se referă la variabila încorporată SECONDS
. Lucrul care trebuie remarcat aici este epoca, este momentul în care a fost început procesul. Deci, putem folosi această tehnică doar pentru măsurați timpii pentru lucrurile care se întâmplă în acel script:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Un alt lucru este să pun toate atribuțiile mele în (( ))
comandă. adică puteți rescrie:
cmd=$(( some_expression ))
ca
(( cmd=some_expression ))
Procedând astfel , putem minimiza apariția simbolului $
.
date '+%s.%N'
date -u
pentru a evita DST și problemele locale cu comanda. Vă rugăm să citiți acest răspunselapsed=$(dc -e "$end_time $start_time - p")