Mesurer le temps dans un script

8

Ce fil montre comment mesurer le temps nécessaire à l'exécution d'un script. Dans mon cas, je souhaite mesurer le temps entre deux points d'un script . Voici un exemple de la façon dont j'aimerais utiliser ceci:

start_measuring_time
Line 1
Line 2
..
Line N
stop_measuring_time
show_elapsed_time

J'aimerais que l'heure affichée soit lisible par l'homme (secondes, minutes, heures, jours, etc.), si possible. Des idees pour faire cela?

Amelio Vazquez-Reina
la source

Réponses:

7

Vous pouvez utiliser dateutil:

#!/bin/bash

start_measuring_time() {
  read s1 s2 < <(date +'%s %N')
}

stop_measuring_time() {
  read e1 e2 < <(date +'%s %N')
}

show_elapsed_time() {
  echo "$((e1-s1)) seconds, $((e2-s2)) nanoseconds"
}

start_measuring_time
sleep 2
stop_measuring_time
show_elapsed_time
enzotib
la source
Cela produira des erreurs: les heures de début et de fin doivent être interprétées comme des secondes + nanosecondes ensemble , pas séparément - vous pouvez obtenir des choses comme des valeurs négatives autrement.
rozcietrzewiacz
1
Voir ma réponse à cette question pour un moyen de résoudre ce problème.
rozcietrzewiacz
J'ai dû déprécier car sa réponse n'est pas complètement correcte, correcte, elle donne parfois des valeurs négatives, mais dans votre question, pourquoi ne mettez-vous pas d'écho avant Tend-Tstart et après$(
munish
11

Vous pouvez simplement utiliser time:

time (
Line 1
Line 2
..
Line N
)

Je pense que la sortie du temps est lisible par l'homme, mais si votre script va mesurer en jours, etc., vérifiez les man timeoptions de formatage pour la sortie.

frabjous
la source
Merci @frabjous! Je pense que j'accepterai la réponse de @ enzotib car elle me permet de mesurer le temps dans les flux de contrôle généraux (c'est-à-dire pas seulement dans les flux linéaires).
Amelio Vazquez-Reina
1

Exemple pour essayer timerscript.sh:

#!/bin/bash

#timing in minutes with %m
start=`date +%m`
echo 'Start:' $start
#do something e.g. wait for 1.30 minutes 
sleep 90

`end=`date +%m`
echo 'End: '$end
echo 'runtime: '$runtime
Jorduino
la source