Voulez-vous savoir combien de temps prend un processus 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 votre 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
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
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
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 lewhich time
pour trouver ce chemin d’accès. - Utiliser
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
fonctionne également, 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 est identique à l’utilisation
command
avant le nom de la commande.
Le moyen le plus simple de vous assurer que vous utilisez GNU time
binaire consiste à utiliser l’option de 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 chaîne dans les deux boucles imbriquées est requise. 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
programmation et utilisation 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 méchant. 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.
En peu de mots, un processus 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, le processus doit faire des requêtes au noyau. Si le noyau approuve la demande, le processus s'exécute en mode noyau jusqu'à ce que l'exigence soit satisfaite. Ensuite, le processus reprend son 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% du temps CPU pendant 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 “n
CPU: « 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 le processus chronométré.
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, vous devez utiliser le -a
(Ajouter) option comme suit:
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 veulent en savoir un peu plus sur ce qui se passe sous le capot chaque fois qu'ils démarrent un programme.