A következőt szeretném megtenni egy szkript egy pontján:
start_time=date
és ez egy folyamat vagy folyamatok lefutása után:
end_time=date
, majd tegye ezt:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Hogyan tenném?
Megjegyzések
-
/usr/bin/time your_script
… - Kapcsolódó: stackoverflow.com/q/8903239/6843677
Válasz
A korszak óta eltelt idő segítségével könnyedén meghatározhat egy időtartamot egy szkriptben
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
A Bash nem támogatja a lebegőpontos számokat, ezért egy olyan külső eszközt kell használnia, mint a bc az idők összehasonlításához 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
Megjegyzések
Válasz
A bash beépített időzítő változó
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Megjegyzések
- Vagy
SECONDS=0; ...; echo "$SECONDS"
. Vigyázzon a hibával .
Válasz
@jasonwryan már javasolta, de “belevetem válaszként, mivel ez is az a lehetőségem, amikor egy szkriptet szeretnék időzíteni. Az idő myscript használatához egyszerűen használja:
time myscript
Megjegyzések
- Időről időre megpróbálom, de ez inkább arra szolgál, amikor szükségem van rá izoláld vagy időzítsd a szkriptem alszakaszait.
- Ez nem hasznos, ha a származtatott eltelt időt magadban akarod felhasználni, például annak kiszámításához, hogy a szkript hány egységet tudott feldolgozni másodpercenként. .
Válasz
Tetszik a @Miata válasza, mert felhívja a figyelmet a date +%s
megoldás. Azonban a @Miata tartalmazza a következőt: .%N
, de nem vagyok biztos benne, milyen előnyökkel jár majd a nanoszekundumok vizsgálata, ha felmerül a date
végrehajtásának költsége parancs alhéjban. Tehát a gyakorlatban a date +%s
elegendőnek kell lennie. A másik megjegyzendő dolog: date +%s
korszak 1970-01-01 00:00:00 UTC. Ami azt jelenti, hogy az idő abszolút korszakkal rendelkezik, és megoszthatja az időmérést a shell szkript különböző példányai vagy különböző gépek között.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Szeretem @glenn jackman ” válasza, mert a SECONDS
bash beépített változóra vonatkozik. Itt meg kell jegyezni, hogy a korszak az az idő, amikor a folyamat elindult. Tehát ezt a technikát csak arra használhatjuk, hogy mérje meg az adott szkripten belüli dolgok idejét:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Másik dolog, hogy az összes hozzárendelésemet a (( ))
parancs. azaz átírhatja:
cmd=$(( some_expression ))
mint
(( cmd=some_expression ))
Ezzel , minimalizálhatjuk a $
szimbólum előfordulását.
date '+%s.%N'
date -u
, hogy elkerülje a parancs DST-jét és helyi problémáit. Kérjük, olvassa el ezt a választelapsed=$(dc -e "$end_time $start_time - p")