453 votes

Obtenir le temps d'exécution du programme dans le shell

Je veux exécuter quelque chose dans un shell linux sous quelques conditions différentes, et être capable de sortir le temps d'exécution de chaque exécution.

Je sais que je pourrais écrire un script en perl ou en python qui ferait cela, mais y a-t-il un moyen de le faire dans le shell (qui se trouve être bash) ?

2 votes

Le boîtier Windows : stackoverflow.com/questions/673523/

0 votes

Est-il possible d'obtenir le Ticks comme le cas de Windows ?

0 votes

580voto

Robert Gamble Points 41984

Utilisez la fonction intégrée time mot-clé :

$ help time

time: time \[-p\] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The \`-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.

Exemple :

$ time sleep 2

real    0m2.009s
user    0m0.000s
sys     0m0.004s

2 votes

Comment cela est-il utilisé sur une commande comme time -p i=x; while read line; do x=x; done < /path/to/file.txt ? Il renvoie immédiatement 0.00 à moins que je ne mette rien avant la boucle while que se passe-t-il ?

0 votes

Il s'agit d'une version pauvre de 'time', intégrée à bash. Où se trouve la commande 'time' externe ?

8 votes

@Znik, essayez /usr/bin/time

135voto

grepsedawk Points 3413

Vous pouvez obtenir des informations beaucoup plus détaillées que celles de l'interface bash. time (c'est-à-dire temps(1) que Robert Gamble mentionne). Normalement, c'est /usr/bin/time .

Note de l'éditeur : Pour s'assurer que vous invoquez bien le utilité externe time plutôt que celle de votre shell time mot-clé et l'invoquer comme /usr/bin/time . time est un Utilitaire mandaté par POSIX mais la seule option qu'il doit prendre en charge est la suivante -p . Des plateformes spécifiques mettent en œuvre des extensions spécifiques et non standard : -v travaille avec GNU 's time utilité, comme le montre la démonstration ci-dessous (la question est étiquetée linux ) ; l'implémentation BSD/macOS utilise -l pour produire un résultat similaire - voir man 1 time .

Exemple de sortie verbeuse :

$ /usr/bin/time -v sleep 1
       Command being timed: "sleep 1"
       User time (seconds): 0.00
       System time (seconds): 0.00
       Percent of CPU this job got: 1%
       Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.05
       Average shared text size (kbytes): 0
       Average unshared data size (kbytes): 0
       Average stack size (kbytes): 0
       Average total size (kbytes): 0
       Maximum resident set size (kbytes): 0
       Average resident set size (kbytes): 0
       Major (requiring I/O) page faults: 0
       Minor (reclaiming a frame) page faults: 210
       Voluntary context switches: 2
       Involuntary context switches: 1
       Swaps: 0
       File system inputs: 0
       File system outputs: 0
       Socket messages sent: 0
       Socket messages received: 0
       Signals delivered: 0
       Page size (bytes): 4096
       Exit status: 0

2 votes

Vous ne sauriez pas par hasard de quel paquet debian cela proviendrait ? il ne semble pas être installé par défaut

1 votes

Je faisais référence à votre message Robert. A moins que vous ne vouliez dire que la commande que vous suggérez n'est pas la commande intégrée de bash ?

27 votes

De manière assez surprenante, il est installé à partir d'un paquet appelé "time".

94voto

David Points 171
#!/bin/bash
START=$(date +%s)
# do something
# start your script work here
ls -R /etc > /tmp/x
rm -f /tmp/x
# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

19 votes

Il existe un moyen beaucoup plus simple. Bash calcule automatiquement la variable spéciale $SECONDS , alors le recalcul basé sur la commande de date externe est inutile. La variable $SECONDS garde combien de secondes le script de Bash est en cours d'exécution quand il démarre. Cette variable a une propriété spéciale. Voir la page de manuel :D

0 votes

J'ai essayé les deux méthodes ci-dessus et celle du commentaire. Dans le premier cas, j'obtiens une erreur 'variable illégale' et dans le second, j'obtiens 'variable non identifiée'.

16voto

Norman Ramsey Points 115730

Si vous avez l'intention d'utiliser les temps par la suite pour faire des calculs, apprenez à utiliser la fonction -f option de /usr/bin/time à la sortie code qui permet de gagner du temps. Voici un code que j'ai utilisé récemment pour obtenir et trier les temps d'exécution des programmes d'une classe entière d'étudiants :

fmt="run { date = '$(date)', user = '$who', test = '$test', host = '$(hostname)', times = { user = %U, system = %S, elapsed = %e } }"
/usr/bin/time -f "$fmt" -o $timefile command args...

J'ai ensuite concaténé tous les $timefile et envoyer la sortie dans un fichier Interprète Lua . Vous pouvez faire la même chose avec Python ou bash ou quelle que soit votre syntaxe préférée. J'aime cette technique.

0 votes

Note : Le chemin complet /usr/bin/time est nécessaire car, bien que which time vous dira le contraire, si vous exécutez simplement time il exécutera la version de votre shell de time qui n'accepte aucun argument.

0 votes

Je choisirais env time :-)

2voto

Robel sharma Points 571

Le chemin est

$ > g++ -lpthread perform.c -o per
$ > time ./per

La sortie est >>

real    0m0.014s
user    0m0.010s
sys     0m0.002s

0 votes

Pas besoin d'utiliser -lphtread o -o tags. Il suffit d'utiliser le time que la réponse acceptée explique mieux.

7 votes

C'était un exemple, c'est à dire que mon perform.c a un threading donc j'ai besoin de -lpthread et pour une simple identité c'est -o per.

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