verstreken tijd in bash krijgen

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

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

  • dit is wat Ik was op zoek naar … kan dit microtime omvatten?
  • Probeer date '+%s.%N'
  • Je moet date aanroepen met date -u om zomertijd en lokale problemen met het commando te vermijden. Gelieve dit antwoord te lezen
  • Aangezien bc (traditioneel) wordt geïmplementeerd met dc, kunt u dc direct gebruiken: elapsed=$(dc -e "$end_time $start_time - p")

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *