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
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
In der Z-Schale (zsh) time
es ist ein reserviertes Wort, daher werden standardmäßig interne Shell-Routinen verwendet.
Geben Sie die Zeit 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 diewhich 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 significa “Nombre 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 caracteres “Kernel Mode (S)”, gefolgt vom Formatbezeichner für die im Kernelmodus verbrachte CPU-Zeit, Was ist es %S
.
Schließlich, vamos a imprimir los caracteres “n
Zentralprozessor: ”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..