So verwenden Sie den Zeitbefehl unter Linux

Inhalt

Linux-PC mit geöffnetem Terminalfenster

Möchten Sie wissen, wie lange ein Verfahren dauert und vieles mehr? El Linux time Der Befehl gibt Zeitstatistiken zurück, die Ihnen interessante Informationen über die von Ihren Programmen verwendeten Ressourcen gibt.

Die Zeit hat viele Verwandte

Es gibt viele Linux-Distributionen und verschiedene Unix-ähnliche Betriebssysteme. Jeder von diesen hat eine Standard-Befehls-Shell. Die häufigste Standard-Shell auf modernen Linux-Distributionen ist die Bash-Shell. Aber es gibt noch viele andere, wie Z-Schale (zsh) y el Shell Korn (ksh).

Alle diese Schalen enthalten ihre eigenen time Befehl, entweder als Eingebunden Befehl oder als a reserviertes Wort. Wenn du schreibst time in einem Terminalfenster, die Shell führt ihren internen Befehl aus, anstatt GNU zu verwenden time Binärdatei, die als Teil Ihrer Linux-Distribution bereitgestellt wird.

Wir wollen die GNU-Version von . verwenden time weil es mehr hat Optionen und es ist flexibler.

Wann wird es laufen?

Sie können überprüfen, welche Version ausgeführt wird, indem Sie die type Befehl. type wird Sie wissen lassen, ob die Shell Ihre Anweisungen selbstständig verarbeitet, mit ihren internen Routinen, oder es wird sie in die GNU-Binärdatei konvertieren.

Geben Sie in einem Terminalfenster das Wort ein type, ein Leerzeichen und dann das Wort time und drücke Enter.

Geben Sie die Zeit ein

Schreibzeit in ein Bash-Terminalfenster

Das können wir in der Bash-Shell sehen time es ist ein reserviertes Wort. Das bedeutet, dass Bash seinetime Standardroutinen.

Geben Sie die Zeit ein

schreibe die Zeit in ein ZSH-Terminalfenster

In der Z-Schale (zsh) time es ist ein reserviertes Wort, daher werden standardmäßig interne Shell-Routinen verwendet.

Geben Sie die Zeit ein

Geben Sie die Zeit in ein Kornschalenfenster ein

In der Schale von Korn time ist ein Stichwort. Anstelle von GNU . wird eine interne Routine verwendet time Befehl.

VERBUNDEN: Was ist ZSH und warum sollte ich es anstelle von Bash verwenden??

Ausführen des GNU-Zeitbefehls

Wenn Ihre Linux-System-Shell ein time Routine muss explizit sein, wenn Sie das GNU verwenden möchten time Spuren. Du solltest:

  • Geben Sie den vollständigen Pfad zur Binärdatei an, Was /usr/bin/time. Führen Sie die which time Befehl, um diesen Pfad zu finden.
  • Verwenden command time.
  • Verwenden Sie einen umgekehrten Schrägstrich wie time.

das which time Der Befehl gibt uns den Pfad zur Binärdatei.

Wir können das testen mit /usr/bin/time als Befehl zum Starten der GNU-Binärdatei. Das funktioniert. Wir haben eine Antwort erhalten von time Befehl, der uns sagt, dass wir keine Befehlszeilenparameter bereitstellen, damit es funktioniert.

Tippen command time es funktioniert auch, und wir erhalten die gleichen Nutzungsinformationen von time. das command Befehl weist die Shell an, den folgenden Befehl zu ignorieren, damit er außerhalb der Shell verarbeitet wird.

Verwendung einer Zeichen vor dem Befehlsnamen ist das gleiche wie mit command vor dem Befehlsnamen.

Der einfachste Weg, um sicherzustellen, dass Sie GNU . verwenden time Binär ist die Verwendung der Backslash-Option.

Zeit
Zeit

time rufe die auf Hülse Wetterversion. time benutze die time Spuren.

Verwenden des Zeitbefehls

Lassen Sie uns einige Programme messen. Wir verwenden zwei Programme namens loop1 und loop2. Sie wurden aus loop1.c und loop2.c erstellt. Sie tun nichts Nützliches, außer die Auswirkungen einer Art von Kodierungsineffizienz zu demonstrieren.

Dies ist loop1.c. Innerhalb der beiden ineinander verschachtelten Schlaufen wird die Länge eines Seils benötigt. Die Länge wird im Voraus ermittelt, außerhalb der beiden verschachtelten Schleifen.

#enthalten "stdio.h"
#enthalten "string.h"
#enthalten "stdlib.h"

int main (int argc, char* argv[])
{
 int ich, J, len, zählen=0;
 char szString[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 // get length of string once, outside of loops
 len = strlen( szString );  

 zum (j=0; J<500000; j++) {

 zum (i=0; ich < len; ich++ ) {

  wenn (szString[ich] == '-')
    count++;
   }
 }

 druckenf("Counted %d hyphensn", zählen);

 Ausfahrt (0);

} // Ende der Hauptsache

Este es loop2.c. La longitud de la cuerda se obtiene una y otra vez para cada ciclo del bucle exterior. Esta ineficiencia debería reflejarse en los tiempos.

#enthalten "stdio.h"
#enthalten "string.h"
#enthalten "stdlib.h"

int main (int argc, char* argv[])
{
 int ich, J, zählen=0;
 char szString[]="how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek-how-to-geek";

 zum (j=0; J<500000; j++) {

 // getting length of string every
 // time the loops trigger
 for (i=0; ich < strlen(szString); ich++ ) {

   wenn (szString[ich] == '-')
    count++;
   }
 }

 druckenf("Counted %d hyphensn", zählen);

 Ausfahrt (0);

} // Ende der Hauptsache

Vamos a encender el loop1 programar y utilizar time um ihre Leistung zu messen.

Zeit ./loop1

Machen wir jetzt dasselbe für loop2.

Zeit ./loop2

Das hat uns zwei Sätze von Ergebnissen gegeben, aber sie sind in einem wirklich widerlichen Format. Wir können später etwas dagegen tun., aber lass uns ein paar Informationen aus den Ergebnissen auswählen.

Wenn Programme laufen, es gibt zwei Ausführungsarten, zwischen denen sie sich abwechseln. Diese nennt man Benutzermodus und Modo-Kernel.

Knapp, eine User-Mode-Prozedur kann außerhalb ihrer eigenen Zuweisung nicht direkt auf Hardware oder Referenzspeicher zugreifen. Um Zugriff auf diese Ressourcen zu erhalten, die Prozedur muss Anfragen an den Kernel stellen. Wenn der Kernel die Anfrage genehmigt, die Prozedur wird im Kernel-Modus ausgeführt, bis die Anforderung erfüllt ist. Nächste, die Prozedur kehrt zur Ausführung im Benutzermodus zurück.

Die Ergebnisse für loop1 erzähl uns das loop1 Schritt 0,09 Sekunden im Benutzermodus. Entweder keine Zeit im Kernel-Modus verbracht oder die Zeit im Kernel-Modus ist zu gering, um aufzuzeichnen, nachdem sie abgerundet wurde. Die gesamte verstrichene Zeit war 0,1 Sekunden. loop1 durchschnittlich erhalten 89% CPU-Zeit über die gesamte verstrichene Zeit.

Die ineffiziente loop2 Das Programm hat dreimal länger gedauert. Ihre gesamte verstrichene Zeit beträgt 0,3 Sekunden. Die Dauer der Bearbeitungszeit im Benutzermodus beträgt 0,29 Sekunden. Für den Kernel-Modus wird nichts protokolliert. loop2 durchschnittlich erhalten 96% CPU-Zeit während der Ausführung.

Ausgabe formatieren

Sie können die Ausgabe von . anpassen time mit einer Formatzeichenfolge. Die Formatzeichenfolge kann Text und Formatbezeichner enthalten. Die Liste der Formatbezeichner kann sein auf der Manpage gefunden von time. Jeder der Formatbezeichner repräsentiert eine Information.

Wenn die Zeichenfolge gedruckt wird, die Formatbezeichner werden durch die tatsächlichen Werte ersetzt, die sie darstellen. Als Beispiel, der Formatbezeichner für den CPU-Prozentsatz ist der Buchstabe P . Um anzuzeigen, time dass ein Formatbezeichner nicht nur ein normaler Buchstabe ist, füge ein Prozentzeichen hinzu, Was %P . Verwenden wir es in einem Beispiel.

das -f Die Option (Formatzeichenfolge) wird verwendet, um anzuzeigen time das was folgt ist eine Formatzeichenfolge.

Unsere Formatzeichenfolge druckt die Zeichen "Programm:„Und der Name des Programms (und alle Befehlszeilenparameter, die Sie an das Programm übergeben). das %C El especificador de formato significaNombre y argumentos de la línea de comandos del comando que se está cronometrando”. das n verschiebt die Ausgabe in die nächste Zeile.

Es gibt viele Formatbezeichner und die Groß-/Kleinschreibung muss beachtet werden, Stellen Sie also sicher, dass Sie sie richtig eingeben, wenn Sie es selbst tun.

Nächste, imprimiremos los caracteres “Gesamtzeit:” seguido del valor del tiempo total transcurrido para esta ejecución del programa (vertreten durch %E).

Wir gebrauchen n um eine weitere neue Zeile zu geben. Nächste, imprimiremos los caracteres “Weg (S) des Benutzers”, gefolgt vom Wert der im Benutzermodus verbrachten CPU-Zeit, vertreten durch die %U.

Wir gebrauchen n um eine weitere neue Zeile zu geben. Dieses Mal bereiten wir uns auf den Kernel-Zeitwert vor. Imprimimos los caracteresKernel Mode (S)”, gefolgt vom Formatbezeichner für die im Kernelmodus verbrachte CPU-Zeit, Was ist es %S.

Schließlich, vamos a imprimir los caracteresnZentralprozessor: ”Um uns eine neue Zeile und einen neuen Titel für diesen Datenwert zu geben. das %P Der Formatbezeichner gibt den durchschnittlichen Prozentsatz der CPU-Zeit an, die von der zeitgesteuerten Prozedur verwendet wird.

Die gesamte Formatzeichenfolge steht in Anführungszeichen. Wir hätten ein paar einfügen können t Zeichen zum Platzieren von Tabulatoren in der Ausgabe, wenn wir beim Ausrichten von Werten wählerisch sind.

Zeit -f "Programm: %CnGesamtzeit: %EnUser-Modus (S) %UnKernel-Modus (S) %SnCPU: %P" ./Schleife1

Senden Sie die Ausgabe an eine Datei

Um die Zeiten der von Ihnen durchgeführten Tests aufzuzeichnen, Sie können die Ausgabe senden von time in eine Datei. Verwenden Sie dazu die -o (Ausgang) Möglichkeit. Die Ausgabe Ihres Programms wird weiterhin im Terminalfenster angezeigt. Es ist nur der Ausgang von time die auf die Datei umgeleitet wird.

Wir können den Test wiederholen und die Ausgabe im test_results.txt Datei wie folgt:

time -o test_results.txt -f "Programm: %CnGesamtzeit: %EnUser-Modus (S) %UnKernel-Modus (S) %SnCPU: %P" ./Schleife1
Katze test_results.txt

das loop1 Die Ausgabe des Programms wird im Terminalfenster angezeigt und die Ergebnisse von time Gehe zum test_results.txt Verfahren.

Wenn Sie die nächsten Ergebnisse in derselben Datei erfassen möchten, muss die verwenden -a (Hinzufügen) nächste Wegoption:

time -o test_results.txt -a -f "Programm: %CnGesamtzeit: %EnUser-Modus (S) %UnKernel-Modus (S) %SnCPU: %P" ./Schleife2
Katze test_results.txt

Es sollte jetzt klar sein, warum wir die %C Formatbezeichner, um den Programmnamen in die Ausgabe des Formatstrings einzuschließen.

Und wir haben keine Zeit

Wahrscheinlich am nützlichsten für Programmierer und Entwickler, um ihren Code zu optimieren, das time Der Befehl ist auch für alle nützlich, die bei jedem Programmstart ein wenig mehr darüber erfahren möchten, was unter der Haube vor sich geht..

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.