So verwenden Sie den time-Befehl unter Linux

Sie möchten wissen, wie lange ein Prozess läuft und vieles mehr? Der Linux-Befehl time gibt Zeitstatistiken zurück und gibt Ihnen coole Einblicke in die von Ihren Programmen verwendeten Ressourcen.

Zeit hat viele Verwandte

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

Alle diese Shells enthalten ihren eigenen Zeitbefehl, entweder als eingebaut Befehl oder als a reserviertes Wort. Wenn Sie Zeit in ein Terminalfenster eingeben, führt die Shell ihren internen Befehl aus, anstatt die GNU-Zeit-Binärdatei zu verwenden, die als Teil Ihrer Linux-Distribution bereitgestellt wird.

Wir wollen die GNU-Version der Zeit verwenden, weil sie mehr hat Optionen und ist flexibler.

Welche Zeit wird ausgeführt?

Sie können überprüfen, welche Version ausgeführt wird, indem Sie den Befehl type verwenden. type teilt Ihnen mit, ob die Shell Ihre Anweisung selbst mit ihren internen Routinen verarbeitet oder sie an die GNU-Binärdatei weitergibt.

Geben Sie in einem Terminalfenster den Worttyp, ein Leerzeichen und dann das Wort Zeit ein und drücken Sie die Eingabetaste.

type time

Wir können sehen, dass Zeit in der Bash-Shell ein reserviertes Wort ist. Dies bedeutet, dass die Bash standardmäßig ihre internen Zeitroutinen verwendet.

type time

In der Z-Shell (zsh) ist Zeit ein reserviertes Wort, daher werden standardmäßig die internen Shell-Routinen verwendet.

type time

In der Korn-Shell ist Zeit ein Schlüsselwort. Anstelle des GNU-Befehls time wird eine interne Routine verwendet.

Ausführen des GNU time-Befehls

Wenn die Shell auf Ihrem Linux-System über eine interne Zeitroutine verfügt, müssen Sie dies explizit angeben, wenn Sie die GNU-Zeitbinärdatei verwenden möchten. Sie müssen entweder:

Geben Sie den gesamten Pfad zur Binärdatei an, z. B. /usr/bin/time. Führen Sie den Befehl what time aus, um diesen Pfad zu finden.
Befehlszeit verwenden.
Verwenden Sie einen umgekehrten Schrägstrich wie die Zeit.

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

Wir können dies testen, indem wir /usr/bin/time als Befehl zum Starten der GNU-Binärdatei verwenden. Das funktioniert. Wir erhalten eine Antwort vom time-Befehl, die uns mitteilt, dass wir keine Befehlszeilenparameter angegeben haben, an denen er arbeiten könnte.

  So fügen Sie Elemente zur Fstab-Datei unter Linux hinzu

Die Eingabe der Befehlszeit funktioniert auch, und wir erhalten die gleichen Nutzungsinformationen von Zeit zu Zeit. Der Befehl Befehl weist die Shell an, den nächsten Befehl zu ignorieren, damit er außerhalb der Shell verarbeitet wird.

Die Verwendung eines Zeichens vor dem Befehlsnamen entspricht der Verwendung von Befehl vor dem Befehlsnamen.

Der einfachste Weg, um sicherzustellen, dass Sie die GNU-Zeitbinärdatei verwenden, besteht darin, die Option Backslash zu verwenden.

time
time

time ruft die Shell-Version von time auf. time verwendet die binäre Zeit.

Verwenden des Zeitbefehls

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

Dies ist loop1.c. Die Länge einer Zeichenfolge wird innerhalb der beiden verschachtelten Schleifen benötigt. Die Länge wird im Voraus außerhalb der beiden verschachtelten Schleifen ermittelt.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, len, count=0;
 char szString[]="1techpc.de-1techpc.de-1techpc.de-1techpc.de-1techpc.de-1techpc.de";

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

 for (j=0; j

This is loop2.c. The length of the string is obtained time after time for every cycle of the outer loop. This inefficiency ought to show up in the timings.

#include "stdio.h"
#include "string.h"
#include "stdlib.h"

int main (int argc, char* argv[])
{
 int i, j, count=0;
 char szString[]="1techpc.de-1techpc.de-1techpc.de-1techpc.de-1techpc.de-1techpc.de";

 for (j=0; j

Let’s fire up the loop1 program and use time to measure its performance.

time ./loop1

Machen wir nun dasselbe für loop2.

time ./loop2

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

Wenn Programme ausgeführt werden, gibt es zwei Ausführungsmodi, zwischen denen sie hin- und hergeschaltet werden. Diese werden als Benutzermodus und Kernelmodus bezeichnet.

Kurz gesagt, ein Prozess im Benutzermodus kann außerhalb seiner eigenen Zuordnung nicht direkt auf Hardware oder Referenzspeicher zugreifen. Um Zugriff auf solche Ressourcen zu erhalten, muss der Prozess Anfragen an den Kernel stellen. Wenn der Kernel die Anforderung genehmigt, geht der Prozess in die Kernelmodusausführung über, bis die Anforderung erfüllt ist. Der Prozess wird dann zurück in die Benutzermodusausführung geschaltet.

Die Ergebnisse für loop1 sagen uns, dass loop1 0,09 Sekunden im Benutzermodus verbracht hat. Es hat entweder null Zeit im Kernel-Modus verbracht oder die Zeit im Kernel-Modus ist ein zu geringer Wert, um nach dem Abrunden registriert zu werden. Die gesamte verstrichene Zeit betrug 0,1 Sekunden. loop1 wurden über die gesamte verstrichene Zeit durchschnittlich 89 % der CPU-Zeit zugeteilt.

Die Ausführung des ineffizienten loop2-Programms dauerte dreimal länger. Die gesamte verstrichene Zeit beträgt 0,3 Sekunden. Die Dauer der Verarbeitungszeit im Benutzermodus beträgt 0,29 Sekunden. Nichts registriert sich für den Kernel-Modus. loop2 wurden für die Dauer seiner Ausführung durchschnittlich 96 % der CPU-Zeit zugeteilt.

Formatieren der Ausgabe

Sie können die Ausgabe von time mithilfe einer Formatzeichenfolge anpassen. Die Formatzeichenfolge kann Text und Formatbezeichner enthalten. Die Liste der Formatbezeichner kann sein auf der manpage gefunden für die Zeit. Jeder der Formatbezeichner repräsentiert eine Information.

Wenn die Zeichenfolge gedruckt wird, werden die Formatbezeichner durch die tatsächlichen Werte ersetzt, die sie darstellen. Der Formatbezeichner für den Prozentsatz der CPU ist beispielsweise der Buchstabe P . Um der Zeit anzuzeigen, dass ein Formatbezeichner nicht nur ein normaler Buchstabe ist, fügen Sie ihm ein Prozentzeichen wie %P hinzu. Verwenden wir es in einem Beispiel.

Die Option -f (Formatstring) wird verwendet, um der Zeit mitzuteilen, dass es sich bei dem, was folgt, um einen Formatstring handelt.

Unsere Formatzeichenfolge gibt die Zeichen „Programm:“ und den Namen des Programms (und alle Befehlszeilenparameter, die Sie an das Programm übergeben) aus. Der Formatbezeichner %C steht für „Name und Befehlszeilenargumente des zeitgesteuerten Befehls“. Das n bewirkt, dass die Ausgabe in die nächste Zeile verschoben wird.

Es gibt viele Formatbezeichner, bei denen die Groß-/Kleinschreibung beachtet wird. Stellen Sie also sicher, dass Sie sie richtig eingeben, wenn Sie dies selbst tun.

Als nächstes drucken wir die Zeichen „Gesamtzeit:“ gefolgt vom Wert der gesamten verstrichenen Zeit für diesen Programmlauf (dargestellt durch %E).

Wir verwenden n, um eine weitere neue Zeile zu geben. Wir geben dann die Zeichen „Benutzermodus (s)“ aus, gefolgt vom Wert der im Benutzermodus verbrachten CPU-Zeit, gekennzeichnet durch das %U.

Wir verwenden n, um eine weitere neue Zeile zu geben. Dieses Mal bereiten wir uns auf den Kernel-Zeitwert vor. Wir geben die Zeichen „Kernel Mode (s)“ aus, gefolgt vom Formatbezeichner für die im Kernel-Modus verbrachte CPU-Zeit, also %S.

Schließlich werden wir die Zeichen „nCPU:“ ausgeben, um uns eine neue Zeile und den Titel für diesen Datenwert zu geben. Der Formatbezeichner %P gibt den durchschnittlichen Prozentsatz der CPU-Zeit an, die vom zeitgesteuerten Prozess verwendet wird.

Die gesamte Formatzeichenfolge wird in Anführungszeichen eingeschlossen. Wir hätten einige t-Zeichen einfügen können, um Tabulatoren in die Ausgabe zu setzen, wenn wir bei der Ausrichtung der Werte pingelig gewesen wären.

time -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1

Senden der Ausgabe an eine Datei

Um die Zeiten der von Ihnen durchgeführten Tests aufzuzeichnen, können Sie die Ausgabe von Zeit zu Zeit in eine Datei senden. Verwenden Sie dazu die Option -o (Ausgabe). Die Ausgabe Ihres Programms wird weiterhin im Terminalfenster angezeigt. Nur die Ausgabe von time wird in die Datei umgeleitet.

Wir können den Test erneut ausführen und die Ausgabe wie folgt in der Datei test_results.txt speichern:

time -o test_results.txt -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop1
cat test_results.txt

Die Programmausgabe von loop1 wird im Terminalfenster angezeigt und die Ergebnisse der Zeit werden in die Datei test_results.txt übernommen.

Wenn Sie die nächsten Ergebnisse in derselben Datei erfassen möchten, müssen Sie die Option -a (anhängen) wie folgt verwenden:

time -o test_results.txt -a -f "Program: %CnTotal time: %EnUser Mode (s) %UnKernel Mode (s) %SnCPU: %P" ./loop2
cat test_results.txt

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

Und wir haben keine Zeit

Der Befehl time ist wahrscheinlich für Programmierer und Entwickler bei der Feinabstimmung ihres Codes von Nutzen. Er ist auch für alle nützlich, die bei jedem Start eines Programms ein bisschen mehr darüber erfahren möchten, was unter der Haube vor sich geht.