Jeg vil gerne gøre følgende på et tidspunkt i et script:
start_time=date
og dette, efter at en proces eller processer er kørt:
end_time=date
og derefter gøre dette:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Hvordan ville jeg gøre dette?
Kommentarer
-
/usr/bin/time your_script
… - Relateret: stackoverflow.com/q/8903239/6843677
Svar
Brug tiden siden epoke til let at identificere et tidsrum i et 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 understøtter ikke flydende numre, så du bliver nødt til at bruge et eksternt værktøj som bc til at 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 indbygget timervariabel
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Kommentarer
- Eller
SECONDS=0; ...; echo "$SECONDS"
. Pas dog på den fejl .
Svar
@jasonwryan foreslog det allerede, men jeg smider det som et svar, da det også er min go-to, når jeg vil time et script. Til tid myscript skal du blot bruge:
time myscript
Kommentarer
- Jeg vil prøve dette fra tid til anden, men dette er mere når jeg har brug for det isoler eller tidsunderafsnit i mit script ..
- Dette er ikke nyttigt, hvis du vil bruge den afledte forløbne tid i selve scriptet, f.eks. til at beregne, hvor mange enheder scriptet kunne behandle pr. sekund .
Svar
Jeg kan godt lide @Miatas svar, fordi det henleder opmærksomheden på date +%s
løsning. Dog inkluderer @Miata .%N
, men jeg er ikke sikker på, hvilken fordel du får ved at se på nanosekunder, når omkostningerne ved at udføre date
kommando i en subshell. Så i praksis bør date +%s
være tilstrækkelig. Den anden ting at bemærke er date +%s
epoke er 1970-01-01 00:00:00 UTC. Hvilket betyder, at tiden har en absolut epoke, og du kan dele tidsmålingen mellem forskellige forekomster af shell-script eller forskellige maskiner.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Jeg kan godt lide @glenn jackman ” s svar, fordi det refererer til SECONDS
bash indbygget variabel. Det, der skal bemærkes her, er epoken er det tidspunkt, hvor processen blev startet. Så vi kan kun bruge denne teknik til måle tider for ting, der sker inden for dette script:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
En anden ting er, at jeg lægger alle mine opgaver inden for (( ))
kommando, dvs. du kan omskrive:
cmd=$(( some_expression ))
som
(( cmd=some_expression ))
Ved at gøre dette , kan vi minimere forekomsten af $
symbolet.
date '+%s.%N'
date -u
for at undgå sommertid og lokale problemer med kommandoen. Venligst læs dette svarelapsed=$(dc -e "$end_time $start_time - p")