Jeg vil gjerne gjøre følgende på et tidspunkt i et skript:
start_time=date
og dette etter at en prosess eller prosesser har kjørt:
end_time=date
og gjør dette:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Hvordan ville jeg gjort dette?
Kommentarer
-
/usr/bin/time your_script
… - Relatert: stackoverflow.com/q/8903239/6843677
Svar
Bruk tiden siden epoken til å enkelt identifisere et tidsrom i et skript
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 støtter ikke flytende tall, så du må bruke et eksternt verktøy som bc for å sammenligne tider som 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
Kommentarer
Svar
bash har en innebygd timervariabel
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Kommentarer
- Eller
SECONDS=0; ...; echo "$SECONDS"
. Vær oppmerksom på den feilen .
Svar
@jasonwryan foreslo det allerede, men jeg vil kaste det inn som et svar, da det også er mitt valg når jeg vil time et skript. For å tid myscript bruk bare:
time myscript
Kommentarer
- Jeg vil prøve dette innimellom, men dette er mer når jeg trenger isoler eller tidsdeler av skriptet mitt.
- Dette er ikke nyttig hvis du vil bruke den avledede forløpte tiden i selve skriptet, f.eks. for å beregne hvor mange enheter skriptet kunne behandle per sekund .
Svar
Jeg liker svaret på @Miata fordi det gjør oppmerksom på date +%s
løsning. Imidlertid inkluderer @Miata .%N
, men jeg er ikke sikker på hvilken fordel du vil se på nanosekunder når det koster å utføre date
kommando i en subshell. Så i praksis bør date +%s
være tilstrekkelig. Den andre tingen å merke seg er date +%s
epoken er 1970-01-01 00:00:00 UTC. Noe som betyr at tiden har en absolutt epoke, og at du kan dele tidsmålingen mellom forskjellige forekomster av skallskript eller forskjellige maskiner.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Jeg liker @glenn jackman » s svar fordi det refererer til SECONDS
bash innebygd variabel. Tingen å merke seg her er epoken er tiden da prosessen ble startet. Så, vi kan bare bruke denne teknikken til å måle tider for ting som skjer i det skriptet:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
En annen ting er at jeg legger alle oppgavene mine i (( ))
kommando. dvs. du kan skrive om:
cmd=$(( some_expression ))
som
(( cmd=some_expression ))
Ved å gjøre dette , kan vi minimere forekomsten av $
-symbolet.
date '+%s.%N'
date -u
for å unngå sommertid og lokale problemer med kommandoen. Vennligst les dette svaretelapsed=$(dc -e "$end_time $start_time - p")