97 votes

Imprimer le temps d'exécution d'une commande shell

Est-il possible d'imprimer le temps d'exécution d'une commande shell avec la combinaison suivante ?

root@hostname:~# "command to execute" && echo "execution time"

126voto

mob Points 61524

time est une commande intégrée dans la plupart des shells qui écrit les informations de temps d'exécution sur le tty.

Vous pouvez également essayer quelque chose comme

start_time=`date +%s`
<command-to-execute>
end_time=`date +%s`
echo execution time was `expr $end_time - $start_time` s.

Ou dans bash :

start_time=`date +%s`
<command-to-execute> && echo run time is $(expr `date +%s` - $start_time) s

0 votes

En accord avec Maaza, cette flexibilité m'a permis de mesurer le temps de tout un ensemble de commandes.

0 votes

Est-il possible d'appliquer les aspects linux autour de n'importe quelle commande linux pour calculer l'exécution

2 votes

L'un des inconvénients de cette approche est qu'elle mesure en secondes, alors que time utilise des millisecondes. Et si vous voulez chronométrer une poignée de commandes ensemble sans avoir à utiliser de variables et de calculs, vous pouvez utiliser des parenthèses : time ( command1 ; command2 ; command3 ) vous pouvez même les chronométrer individuellement avec un temps total, comme ceci : time ( time command1 ; time command2 ; time command3 ) Bien sûr, si vous voulez une vingtaine de commandes, il est préférable d'utiliser la solution de cette réponse. Mais alors, vous devriez commencer à penser à mettre toutes vos commandes dans un script...

82voto

Mark Rushakoff Points 97350

N'oubliez pas qu'il y a une différence entre la fonction intégrée de bash time (qui devrait être appelé par défaut quand vous faites time command ) et /usr/bin/time (ce qui devrait vous obliger à l'appeler par son chemin complet).

La fonction intégrée time imprime toujours sur stderr, mais /usr/bin/time vous permettra d'envoyer la sortie de time dans un fichier spécifique, afin de ne pas interférer avec le flux stderr de la commande exécutée. Aussi, /usr/bin/time Le format de la commande est configurable en ligne de commande. o par la variable d'environnement TIME alors que la fonction intégrée de bash time Le format est sólo configuré par le TIMEFORMAT variable d'environnement.

$ time factor 1234567889234567891 # builtin
1234567889234567891: 142662263 8653780357

real    0m3.194s
user    0m1.596s
sys 0m0.004s
$ /usr/bin/time factor 1234567889234567891
1234567889234567891: 142662263 8653780357
1.54user 0.00system 0:02.69elapsed 57%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+215minor)pagefaults 0swaps
$ /usr/bin/time -o timed factor 1234567889234567891 # log to file `timed`
1234567889234567891: 142662263 8653780357
$ cat timed
1.56user 0.02system 0:02.49elapsed 63%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+217minor)pagefaults 0swaps

0 votes

De man bash : "La variable TIMEFORMAT peut être définie sur une chaîne de format qui spécifie la manière dont les informations de synchronisation doivent être affichées".

0 votes

Oups - Je pensée il y avait un moyen de le formater, mais je l'ai raté en help time parce que j'ai seulement jeté un coup d'œil dessus et j'ai pensé que c'était un argument de ligne de commande. Je vais mettre à jour la réponse.

3 votes

Nous voici 9 ans plus tard et la commande n'a pris que 0m0.018s. J'ai juste pensé que je devais le signaler.

32voto

Jason Points 1745
root@hostname:~# time [command]

Il fait également la distinction entre le temps réel utilisé et le temps système utilisé.

0 votes

C'est certainement la réponse de base - mais il y a quelques complications si vous voulez voir la sortie d'erreur de la commande et envoyer les informations de synchronisation à la sortie standard comme le fait la question. La commande de temps écrit sur stderr. Ce que vous suggérez est probablement assez précis - d'où mon +1.

2 votes

time écrit sur le tty, pas sur stderr. Ce qui, je suppose, rend les choses plus difficiles.

16voto

Janus Troelsen Points 5121

Pour une mesure du delta ligne par ligne, essayez gnome .

Il s'agit d'un utilitaire de ligne de commande, un peu comme ts de moreutils, pour ajouter des informations d'horodatage à la sortie standard d'une autre commande. Utile pour les processus qui s'exécutent depuis longtemps et pour lesquels vous souhaitez avoir un historique de ce qui prend tant de temps.

Si vous envoyez quoi que ce soit à gnomon, un horodatage sera ajouté à chaque ligne, indiquant combien de temps cette ligne était la dernière dans le tampon, c'est-à-dire combien de temps il a fallu pour que la ligne suivante apparaisse. Par défaut, gnomon affiche les secondes écoulées entre chaque ligne, mais cela est configurable.

gnomon demo

9voto

nav Points 271

Complément à la réponse de @mob :

Ajout de %N a date +%s nous donne une précision de l'ordre de la nanoseconde :

start=`date +%s%N`;<command>;end=`date +%s%N`;echo `expr $end - $start`

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X