Je voudrais faire ce qui suit à un moment donné dans un script:
start_time=date
et ceci après lexécution dun ou plusieurs processus:
end_time=date
et ensuite faire ceci:
elapsed=$end_time-$start_time echo "Total of $elapsed seconds elapsed for process"
Comment puis-je procéder?
Commentaires
-
/usr/bin/time your_script
… - Connexes: stackoverflow.com/q/8903239/6843677
Réponse
Utilisez le temps écoulé depuis lépoque pour identifier facilement une période dans un 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 ne prend pas en charge les nombres à virgule flottante, vous devrez donc utiliser un outil externe comme bc pour comparer des temps comme 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
Commentaires
Réponse
bash a un variable de minuterie intégrée
start=$SECONDS # do stuff end=$SECONDS duration=$(( end - start )) echo "stuff took $duration seconds to complete"
Commentaires
- Ou
SECONDS=0; ...; echo "$SECONDS"
. Attention cependant à ce bogue .
Réponse
@jasonwryan la déjà suggéré, mais je vais le donner comme réponse car cest aussi mon choix lorsque je veux chronométrer un script. Pour chronométrer myscript , utilisez simplement:
time myscript
Commentaires
- Jessaierai ceci de temps en temps mais cest plus pour quand jai besoin de isoler ou chronométrer les sous-sections de mon script.
- Ce nest pas utile si vous souhaitez utiliser le temps écoulé dérivé dans le script lui-même, par exemple pour calculer le nombre dunités que le script a pu traiter par seconde .
Réponse
Jaime la réponse de @Miata « car elle attire lattention sur date +%s
solution. Cependant, @Miata inclut .%N
mais je ne sais pas quel avantage vous obtiendrez en regardant les nanosecondes quand il y a le coût de lexécution de date
commande dans un sous-shell. Ainsi, en pratique, date +%s
devrait être suffisant. Lautre chose à noter est que date +%s
est 1970-01-01 00:00:00 UTC. Ce qui signifie que le temps a une époque absolue et que vous pouvez partager la mesure du temps entre différentes instances de script shell ou différentes machines.
(( start=$(date +%s) )) # 1604026743 # ... some activity that lasts for, say, 24 seconds (( end=$(date -u +%s) )) # 1604026767 (( duration=end-start )) # 24
Jaime @glenn jackman » car elle fait référence à la variable intégrée SECONDS
bash. La chose à noter ici est lépoque à laquelle le processus a été lancé. Nous ne pouvons donc utiliser cette technique que pour mesurer les temps pour les choses qui se produisent dans ce script:
(( start=SECONDS )) # 10 # ... some activity that lasts for, say, 24 seconds (( end=SECONDS )) # 34 (( duration=end-start )) # 24
Une autre chose est que je place toutes mes affectations dans le (( ))
commande. cest-à-dire que vous pouvez réécrire:
cmd=$(( some_expression ))
comme
(( cmd=some_expression ))
En faisant cela , nous pouvons minimiser loccurrence du symbole $
.
date '+%s.%N'
date -u
pour éviter lheure dété et les problèmes locaux avec la commande. Veuillez lire cette réponseelapsed=$(dc -e "$end_time $start_time - p")