[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Pakete_installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(2)]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] '''time''' dient zur Messung der Laufzeit von Programmen und Shell-Befehlen. Es wird häufig zur Optimierung selbstgeschriebener Programme verwendet. Die [:Bash:] enthält eine Version des time-Programms als reserviertes Schlüsselwort. Das Schlüsselwort `time` hat im Gegensatz zum externen Programm eine eingeschränkte Auswahl an Optionen und eine unterschiedliche Syntax. Um auch in der Bash den externen Befehl aufzurufen, muss entweder der komplette Programmpfad `/usr/bin/time` oder die Anweisung `command time` angegeben werden. In einer anderen [:Shell:] (wie z.B. [:Dash:] oder [:Zsh:]) wird mit dem Befehl `time` das externe Programm ausgeführt. Das ist zu berücksichtigen, wenn in Skripten damit gearbeitet wird, deren [:Shebang_für_Shellskripte:Shebang] z.B. `#!/bin/sh` lautet. Bei Ubuntu verweist die Skript-Shell nicht auf '''bash''' sondern auf '''dash'''. = Installation = Der externe Befehl sollte standardmäßig bereits installiert sein, kann aber mit dem folgenden Paket bei Bedarf nachinstalliert [1] werden: {{{#!vorlage Paketinstallation time }}} = Bedienung (Bash-Schlüsselwort) = In der Bash ist `time` ein reserviertes Schlüsselwort (wie `if` oder `for`). Die allgemeine Syntax ist [2]: {{{#!vorlage Befehl time PIPELINE }}} `PIPELINE` ist dabei entweder ein einzelner Befehl oder eine [:Shell/Umleitungen:Pipeline]. == Optionen == Das Bash-Schlüsselwort kennt eine einzige Option für eine modifizierte Anzeige der Ergebnisse: ||<-2 tablestyle="width: 95%;" cellstyle="background-color: #E2C890; text-align: center;"> '''time - Optionen''' || ||'''Option'''||'''Beschreibung'''|| ||``-p`` ||Ausgabe der Laufzeit in einem Format kompatibel zu Posix.|| == Beispiele == Die folgende Anweisung sucht im HOME-Verzeichnis des Benutzers nach MP3-Dateien und gibt am Ende der Liste die Laufzeit aus: {{{#!vorlage Befehl time find ~ -name *.mp3 -type f }}} Im Gegensatz zum externen `time`-Befehl können auch Pipelines verwendet werden. In diesem Beispiel wird ein sortiertes Inhaltsverzeichnis ausgegeben mit Angabe der kompletten Laufzeit: {{{#!vorlage Befehl time ls ~ | sort }}} Es kann auch die Laufzeit von mehreren hintereinander laufenden Befehlen gemessen werden: {{{#!vorlage Befehl time (echo "Start"; sleep 1; sleep 0.5; echo "Ende") }}} Umleiten des Standardfehlerkanals `stderr` eines Programms: {{{#!vorlage Befehl time tar -cf sicherung.tgz "/home" 2>> backup.log }}} Die Fehlermeldungen von tar landen dabei in der Datei '''backup.log''', die Laufzeiten erscheinen aber im Terminal. Soll die Laufzeit ebenfalls in die Datei geschrieben werden, muss mit geschweiften Klammern gruppiert werden: {{{#!vorlage Befehl { time tar -cf sicherung.tgz "/home"; } 2>> backup.log }}} = Bedienung (externer Befehl) = Um den externen Befehl `time` zu starten, öffnet man ein Terminal [2] und führt den folgenden Befehl aus: {{{#!vorlage Befehl /usr/bin/time BEFEHL PARAMETER }}} oder {{{#!vorlage Befehl command time BEFEHL PARAMETER }}} Als ``BEFEHL`` wird das Programm oder der Befehl eingegeben, von dem die Laufzeit gemessen werden soll. Falls dieser Befehl zusätzliche Parameter benötigt, können sie direkt im Anschluss an den Befehl angegeben werden. == Optionen == Der externe Befehl time kennt viele Optionen, mit denen die anzuzeigenden Daten beeinflusst werden können: === Optionen (Formatierung der Ausgabe) === Hier sind nicht alle Formatierungen aufgeführt. Die komplette Übersicht kann man in den [:man:Manpages] zu time finden. ||<-2 tablestyle="width: 95%;" cellstyle="background-color: #E2C890; text-align: center;"> '''time - Formatierungen''' || ||'''Format'''||'''Beschreibung'''|| ||``\n`` ||Eine neue Zeile wird begonnen.|| ||``\t`` ||Ein Tabulator wird ausgegeben.|| ||``\\`` ||Ein Backslash '\' wird ausgegeben.|| ||``%%`` ||Das Prozent-Zeichen '%' wird ausgegeben.|| ||``%C`` ||Den Namen und die Parameter des zu testenden Befehls ausgeben.|| ||``%E`` ||Komplette Laufzeit des Befehls in \[Stunden:]Minuten:Sekunden.|| ||``%e`` ||Komplette Laufzeit des Befehls in Sekunden.|| ||``%I`` ||Anzahl der Lesezugriffe auf das Dateisystem.|| ||``%K`` ||Durchschnittlicher Speicherverbrauch des Befehls in Kilobyte.|| ||``%O`` ||Anzahl der Schreibzugriffe auf das Dateisystem.|| ||``%P`` ||Auslastung der CPU in Prozent.|| ||``%S`` ||Anzahl der Sekunden, die der Befehl im Systembereich (kernel space) verbracht hat.|| ||``%U`` ||Anzahl der Sekunden, die der Befehl im Benutzerbereich (user space) verbracht hat.|| ||``%x`` ||Beendigungscode des getesteten Befehls.|| === Optionen (Ausgabe) === Die Ausgabe der gesammelten Daten kann mit folgenden Optionen beeinflusst werden: ||<-2 tablestyle="width: 95%;" cellstyle="background-color: #E2C890; text-align: center;"> '''time - Optionen (Ausgabe)''' || ||'''Option'''||'''Beschreibung'''|| ||``-a``||Fügt die Ausgabe ans Ende der Datei hinzu statt sie zu überschreiben - nur in Verbindung mit der Option '`-o`' sinnvoll.|| ||``-o DATEI``||Schreibt die Ausgabe in die angegebene Datei statt auf den Bildschirm.|| ||``-f 'FORMAT'``||Bereitet die Ausgabe mit der angegebenen Formatierung auf. Wird diese Option nicht angegeben, dann dient die Shell-Variable ''$TIME'' als Vorlage.|| ||``-p``||Die Ausgabe erfolgt im POSIX-Standard 1003.2|| ||``-v``||Sämtliche gesammelten Daten werden mit einer englischen Beschreibung zeilenweise ausgegeben.|| === sonstige Optionen === ||<-2 tablestyle="width: 95%;" cellstyle="background-color: #E2C890; text-align: center;"> '''time - Optionen (Sonstige)''' || ||'''Option'''||'''Beschreibung'''|| ||``--help`` ||Anzeige aller möglichen Optionen des '''time'''-Befehls.|| ||``-V`` ||Anzeige der aktuellen Version des '''time'''-Befehls.|| == Beispiele == Die folgende Anweisung sucht im HOME-Verzeichnis des Benutzers nach '''MP3'''-Dateien und gibt am Ende der Liste die Laufzeit aus: {{{#!vorlage Befehl /usr/bin/time find ~ -name *.mp3 -type f }}} Über einen Umweg lassen sich auch mit dem externen Programm eine Pipeline oder mehrere Skriptbefehle messen. Dazu startet man die zu testenden Befehle innerhalb einer eigenen Shell-Umgebung: {{{#!vorlage Befehl /usr/bin/time -f 'Laufzeit: %e Sekunden' sh -c 'find ~ -name *.mp3 -type f|sort' }}} = Erläuterung zu den ermittelten Zeiten = Mit dem `time`-Befehl können drei verschiedene Zeiten angezeigt werden: * Die ``system``- bzw. ''sys''-Zeit zeigt an, wieviel Zeit innerhalb des Linux-Kernels verbraucht wurde. * Die ``user``-Zeit zeigt an, wieviel Zeit innerhalb der Anwendung selbst (ohne Linux-Kernel) verbraucht wurde. * Die ``elapsed``- bzw. ``real``-Zeit gibt die gesamte Laufzeit des Befehls an. Da Linux ein Multitasking-Betriebssystem ist, werden gleichzeitig auch noch andere Programme ausgeführt, die natürlich auch noch Extra-Zeit benötigen. Wenn bei Dateizugriffen auf Daten von der Festplatte gewartet wird, dann befindet sich die Anwendung in einer Warteposition und verbraucht keine CPU-Zeit - die Laufzeit verlängert sich aber natürlich durch das Warten. Daher kann dieser Wert höher sein als die Summe von ``system``- und ``user``-Zeit. = Links = * [:Shell/Befehlsübersicht:] {Übersicht} Übersicht über verschiedene Shell-Befehle #tag: System, Shell