Ik zou graag het volgende willen doen op een bepaald punt in een script:
start_time=date
en dit nadat een proces of processen zijn uitgevoerd:
end_time=date
en doe dit dan:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Hoe zou ik dit doen?
Reacties
-
/usr/bin/time your_script
… - Gerelateerd: stackoverflow.com/q/8903239/6843677
Answer
Gebruik de tijd sinds epoch om gemakkelijk een tijdspanne in een script te identificeren
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 ondersteunt geen drijvende-kommagetallen, dus je zult een externe tool zoals bc moeten gebruiken om tijden zoals 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
Reacties
Antwoord
bash heeft een ingebouwde timervariabele
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Reacties
- Of
SECONDS=0; ...; echo "$SECONDS"
. Pas echter op voor die bug .
Antwoord
@jasonwryan heeft het al voorgesteld, maar ik “gooi het als antwoord in, want het is ook mijn go-to wanneer ik een script wil timen. Om mijnscript te timen, gebruik ik gewoon:
time myscript
Reacties
- Ik zal dit van tijd tot tijd proberen, maar dit is meer voor wanneer het nodig is isoleer of tijd subsecties van mijn script ..
- Dit is niet handig als je de afgeleide verstreken tijd in het script zelf wilt gebruiken, bijvoorbeeld om te berekenen hoeveel eenheden het script per seconde kon verwerken .
Antwoord
Ik vind het antwoord van @Miata leuk omdat het de aandacht vestigt op date +%s
oplossing. @Miata bevat echter .%N
, maar ik weet niet zeker welk voordeel u krijgt als u naar nanoseconden kijkt als er kosten zijn voor het uitvoeren van de date
commando in een subshell. Dus in de praktijk zou date +%s
voldoende moeten zijn. Het andere ding om op te merken is date +%s
epoch is 1970-01-01 00:00:00 UTC. Dat betekent dat de tijd een absoluut tijdperk heeft en dat je de tijdmeting kunt delen tussen verschillende instanties van shellscript of verschillende machines.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Ik hou van @glenn jackman ” s antwoord omdat het verwijst naar SECONDS
bash ingebouwde variabele. Het ding om hier op te merken is het tijdperk is het tijdstip waarop het proces werd gestart. We kunnen deze techniek dus alleen gebruiken om meet tijden voor dingen die binnen dat script gebeuren:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Een ander ding is dat ik al mijn opdrachten in de (( ))
commando. dwz u kunt het volgende herschrijven:
cmd=$(( some_expression ))
als
(( cmd=some_expression ))
Door dit te doen , kunnen we het voorkomen van het $
-symbool minimaliseren.
date '+%s.%N'
date -u
om zomertijd en lokale problemen met het commando te vermijden. Gelieve dit antwoord te lezenelapsed=$(dc -e "$end_time $start_time - p")