Bash : mesurer le temps

Anne bash time

Attendre

La fonction sleep sert à attendre. Par défaut, elle prend en argument le nombre de seconde à attendre, mais on peut utiliser un suffixe pour préciser l’unité (s pour les secondes, m pour des minutes, h pour des heures, d pour des jours).

Timeout

Pour lancer une tâche en lui accordant un temps maximum, il faut utiliser la fonction timeout.

Mesurer le temps d’exécution d’une commande

Le plus simple est de faire précéder la commande du mot clé time de bash. Par exemple :

$ time sleep 10

real	0m10.002s
user	0m0.000s
sys	0m0.002s

On peut configurer l’affichage avec la variable TIMEFORMAT. Par exemple :

$ (TIMEFORMAT="===== Time: real=%3lR user=%3lU sys=%3lS" ; time  sleep 5)
===== Time: real=0m5.002s user=0m0.000s sys=0m0.002s

mais :

Récupérer la sortie de time dans une variable

Le résultat de time est émis sur stderr. Si la commande que l’on veut mesurer n'écrit pas sur la sortie standard, on peut faire :

var=$(time cmd 2>&1 > cmd.log)

C’est plus compliqué si on souhaite récupérer la sortie d’erreur de la commande dans un fichier, et le temps dans une variable. Une solution est :

var=$( { time cmd > cmd.log 2> cmd.err ; } 2>&1 )

Attention aux accolades et au point virgule.

Pour des informations plus détaillées, voir BashFAQ-032.

Durée entre deux instants

Il est parfois plus pratique de calculer le temps écoulé entre deux mesures :

t0=$(date +%s)
...
d=$(($(date +%s) - $t0))
echo "$(($d / 3600 ))h$((($d % 3600) / 60))m$(($d % 60))s"

Date ou durée sur la ligne de commande

L’option -d de date permet de donner une chaîne qui décrit une date plutôt que d’utiliser la date courante. Le format d’entrée est extrêmement riche (voir la [doc http://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html#Date-input-formats]). Ici, on utilise @ pour entrée un //timestamp// (durée en secondes).

$ date -u -d @1462958438
mercredi 11 mai 2016, 09:20:38 (UTC+0000)
$ date -u -d @1462978153
mercredi 11 mai 2016, 14:49:13 (UTC+0000)
$ date -u -d @$((1462978153 - 1462958438)) +"%T"
05:28:35

Voir aussi :