Comment utiliser la commande time sous Linux

Contenu

PC Linux avec une fenêtre de terminal ouverte

Voulez-vous savoir combien de temps dure une procédure et bien plus encore? Sous Linux time La commande renvoie des statistiques de temps, qui vous donne des informations intéressantes sur les ressources utilisées par vos programmes.

le temps a beaucoup de parents

Il existe de nombreuses distributions Linux et différents systèmes d'exploitation de type Unix. Chacun d'eux a un shell de commande par défaut. Le shell par défaut le plus courant sur les distributions Linux modernes est le shell bash. Mais il y en a bien d'autres, comme la coquille Z (zsh) y el shell Korn (ksh).

Toutes ces coquilles incorporent leur propre time commander, soit en tant que Incorporé commande ou en tant que mot reservé. Quand tu écris time dans une fenêtre de terminal, le shell exécutera sa commande interne au lieu d'utiliser GNU time binaire fourni dans le cadre de votre distribution Linux.

Nous voulons utiliser la version GNU de time car il a plus options et c'est plus souple.

À quelle heure fonctionnera-t-il?

Vous pouvez vérifier quelle version s'exécutera en utilisant le type commander. type vous dira si le shell gérera vos instructions tout seul, avec leurs routines internes, ou il les convertira en binaire GNU.

dans une fenêtre de terminal tapez le mot type, un espace puis le mot time et appuyez sur Entrée.

taper l'heure

temps d'écriture dans une fenêtre de terminal bash

Nous pouvons voir que dans le shell bash time c'est un mot réservé. Cela signifie que Bash utilisera sontime routines par défaut.

taper l'heure

écrire l'heure dans une fenêtre de terminal zsh

Dans la coque Z (zsh) time c'est un mot réservé, donc les routines internes du shell seront utilisées par défaut.

taper l'heure

taper l'heure dans une fenêtre de shell korn

Dans la coquille de Korn time est un mot-clé. Une routine interne sera utilisée à la place de GNU time commander.

EN RELATION: Qu'est-ce que ZSH et pourquoi devrais-je l'utiliser à la place de Bash?

Exécuter la commande GNU time

Si votre shell système Linux a un time la routine devra être explicite si vous voulez utiliser le GNU time des pistes. Vous devriez:

  • Fournir le chemin complet vers le binaire, Quoi /usr/bin/time. Exécutez le which time commande pour trouver ce chemin.
  • Utilisation command time.
  • Utilisez une barre oblique inverse comme time.

Les which time La commande nous donne le chemin vers le binaire.

Nous pouvons tester cela en utilisant /usr/bin/time en tant que commande pour démarrer le binaire GNU. Ça marche. Nous avons reçu une réponse de time commande qui nous dit que nous ne fournissons aucun paramètre de ligne de commande pour que cela fonctionne.

Dactylographie command time ça marche aussi, et nous obtenons les mêmes informations d'utilisation de time. Les command commande indique au shell d'ignorer la commande suivante afin qu'elle soit traitée en dehors du shell.

Utilisant un caractère avant le nom de la commande revient à utiliser command avant le nom de la commande.

Le moyen le plus simple de vous assurer que vous utilisez GNU time binaire est d'utiliser l'option barre oblique inverse.

temps
temps

time invoquer le coquille version météo. time Utilisez le time des pistes.

Utilisation de la commande heure

Mesurons quelques programmes. Nous utilisons deux programmes appelés loop1 et loop2. Ils ont été créés à partir de loop1.c et loop2.c. Ils ne font rien d'autre que de démontrer les effets d'une sorte d'inefficacité du codage.

C'est loop1.c. La longueur d'une corde est nécessaire dans les deux boucles imbriquées. La longueur est obtenue à l'avance, en dehors des deux boucles imbriquées.

#comprendre "stdio.h"
#comprendre "chaîne.h"
#comprendre "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, Len, nombre=0;
 char szString[]="comment-to-geek-comment-à-geek-comment-geek-comment-geek-comment-geek-comment-geek-comment-geek-comment-geek";

 // obtenir la longueur de la chaîne une fois, outside of loops
 len = strlen( szString );  

 pour (j=0; j<500000; j++) {

 pour (i=0; je < Len; je++ ) {

  si (szString[je] == '-')
    count++;
   }
 }

 imprimer("Nombre de tirets %d", compter);

 sortir (0);

} // fin du principal

C’est la boucle2.c. La longueur de la chaîne est obtenue encore et encore pour chaque cycle de la boucle externe. Cette inefficacité devrait se refléter dans le temps.

#comprendre "stdio.h"
#comprendre "chaîne.h"
#comprendre "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, nombre=0;
 char szString[]="comment-to-geek-comment-à-geek-comment-geek-comment-geek-comment-geek-comment-geek-comment-geek-comment-geek";

 pour (j=0; j<500000; j++) {

 // obtenir la longueur de la chaîne tous les
 // time the loops trigger
 for (i=0; je < strlen(szString); je++ ) {

   si (szString[je] == '-')
    count++;
   }
 }

 imprimer("Nombre de tirets %d", compter);

 sortir (0);

} // fin du principal

Allumons le loop1 programar y utilizar time mesurer leurs performances.

temps ./boucle1

Faisons maintenant la même chose pour loop2.

temps ./boucle2

Cela nous a donné deux séries de résultats, mais ils sont dans un format vraiment dégoûtant. Nous pouvons faire quelque chose plus tard., mais prenons quelques informations dans les résultats.

Lorsque les programmes s'exécutent, il existe deux modes d'exécution entre lesquels ils alternent. Ceux-ci sont appelés mode utilisateur et noyau modo.

Brièvement, une procédure en mode utilisateur ne peut pas accéder directement au matériel ou à la mémoire de référence en dehors de sa propre allocation. Pour accéder à ces ressources, la procédure doit faire des requêtes au noyau. Si le noyau approuve la demande, la procédure s'exécute en mode noyau jusqu'à ce que l'exigence soit satisfaite. Ensuite, la procédure revient en exécution en mode utilisateur.

Les résultats pour loop1 dis nous que loop1 étape 0,09 secondes en mode utilisateur. Soit aucun temps passé en mode noyau, soit le temps en mode noyau est trop faible pour être enregistré une fois qu'il a été arrondi à l'inférieur. Le temps total écoulé était 0,1 secondes. loop1 reçu en moyenne 89% Temps CPU sur le temps total écoulé.

L'inefficace loop2 Le programme a mis trois fois plus de temps à s'exécuter. Votre temps total écoulé est 0,3 secondes. La durée du temps de traitement en mode utilisateur est 0,29 secondes. Rien n'est enregistré pour le mode noyau. loop2 reçu en moyenne 96% Temps CPU pendant l'exécution.

Formater la sortie

Vous pouvez personnaliser la sortie de time en utilisant une chaîne de format. La chaîne de format peut contenir du texte et des spécificateurs de format. La liste des spécificateurs de format peut être trouvé sur la page de manuel pour time. Chacun des spécificateurs de format représente une information.

Lorsque la chaîne est imprimée, les spécificateurs de format sont remplacés par les valeurs réelles qu'ils représentent. Par exemple, le spécificateur de format pour le pourcentage de CPU est la lettre P . Pour indiquer à time qu'un spécificateur de format n'est pas simplement une lettre normale, ajouter un signe de pourcentage, Quoi %P . Utilisons-le dans un exemple.

Les -f L'option (chaîne de format) est utilisé pour indiquer time que ce qui suit est une chaîne de format.

Notre chaîne de format imprimera les caractères "Programme:« Et le nom du programme (et tous les paramètres de ligne de commande que vous passez au programme). Les %C Le spécificateur de format signifie “Nom de la ligne de commande et arguments de la commande en cours de temporisation”. Les n fait passer la sortie à la ligne suivante.

Il existe de nombreux spécificateurs de format et ils sont sensibles à la casse, alors assurez-vous de les saisir correctement lorsque vous le faites vous-même.

Ensuite, nous imprimerons les caractères “Temps total:” suivi de la valeur du temps total écoulé pour l’exécution de ce programme (représenté par %E).

Nous utilisons n donner une autre nouvelle ligne. Ensuite, nous imprimerons les caractères “Manière (s) de l'utilisateur”, suivi de la valeur du temps CPU passé en mode utilisateur, représenté par le %U.

Nous utilisons n donner une autre nouvelle ligne. Cette fois, nous nous préparons pour la valeur de temps du noyau. Nous imprimons les caractères “Mode noyau (s)”, suivi du spécificateur de format pour le temps CPU passé en mode noyau, Qu'est que c'est %S.

Finalement, imprimons les caractères “nCPU: « Pour nous donner une nouvelle ligne et un nouveau titre pour cette valeur de données. Les %P Le spécificateur de format donnera le pourcentage moyen de temps CPU utilisé par la procédure chronométrée.

La chaîne de format entière est entre guillemets. Nous aurions pu inclure certains t caractères pour placer des tabulations dans la sortie si nous sommes pointilleux sur l'alignement des valeurs.

temps -f "Programme: %CnTemps total: %EnUser Mode (s) %Mode UnKernel (s) %SnCPU: %P" ./boucle1

Envoyer la sortie dans un fichier

Pour garder une trace des heures des tests que vous avez effectués, vous pouvez envoyer la sortie de time dans un fichier. Pour ce faire, utilisez le -o (Sortir) option. La sortie de votre programme continuera à s'afficher dans la fenêtre du terminal. C'est juste la sortie de time qui est redirigé vers le fichier.

Nous pouvons réexécuter le test et enregistrer la sortie dans le test_results.txt fichier comme suit:

temps -o test_results.txt -f "Programme: %CnTemps total: %EnUser Mode (s) %Mode UnKernel (s) %SnCPU: %P" ./boucle1
chat test_results.txt

Les loop1 La sortie du programme est affichée dans la fenêtre du terminal et les résultats de time Allez au test_results.txt Record.

Si vous souhaitez capturer la prochaine série de résultats dans le même fichier, doit utiliser le -a (Ajouter) option suivante:

temps -o test_results.txt -a -f "Programme: %CnTemps total: %EnUser Mode (s) %Mode UnKernel (s) %SnCPU: %P" ./boucle2
chat test_results.txt

Il devrait maintenant être clair pourquoi nous utilisons le %C spécificateur de format pour inclure le nom du programme dans la sortie de la chaîne de format.

Et nous sommes hors du temps

Probablement le plus utile pour les programmeurs et les développeurs pour peaufiner leur code, les time La commande est également utile pour tous ceux qui souhaitent en savoir un peu plus sur ce qui se passe sous le capot chaque fois qu'ils démarrent un programme..

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.