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 -ufor å unngå sommertid og lokale problemer med kommandoen. Vennligst les dette svaretelapsed=$(dc -e "$end_time $start_time - p")