Gibt es eine integrierte Möglichkeit, die Ausführungszeit eines Befehls in der Windows-Befehlszeile zu messen?
Dies ist die beste Lösung für Windows-7-Benutzer, da timeit.exe anscheinend Windows 7 nicht unterstützt.
Gibt es eine integrierte Möglichkeit, die Ausführungszeit eines Befehls in der Windows-Befehlszeile zu messen?
PowerShell hat dafür ein Cmdlet namens Measure-Command
. Sie müssen sicherstellen, dass PowerShell auf dem ausführenden Computer verfügbar ist.
PS> Measure-Command { echo hi }
Tage : 0
Stunden : 0
Minuten : 0
Sekunden : 0
Millisekunden : 0
Ticks : 1318
GesamtTage : 1.52546296296296E-09
GesamtStunden : 3.66111111111111E-08
GesamtMinuten : 2.19666666666667E-06
GesamtSekunden : 0.0001318
GesamtMillisekunden: 0.1318
Measure-Command
erfasst die Ausgabe des Befehls. Sie können die Ausgabe zurück in Ihre Konsole umleiten, indem Sie Out-Default
verwenden:
PS> Measure-Command { echo hi | Out-Default }
hi
Tage : 0
...
Wie Makotoe kommentierte, gibt Measure-Command
ein TimeSpan
-Objekt zurück, daher wird die gemessene Zeit als eine Reihe von Feldern gedruckt. Sie können das Objekt in einen Zeitstempelstring formatieren, indem Sie ToString()
verwenden:
PS> (Measure-Command { echo hi | Out-Default }).ToString()
hi
00:00:00.0001318
Wenn der Befehl innerhalb von Measure-Command
die Textfarbe Ihrer Konsole ändert, verwenden Sie [Console]::ResetColor()
, um sie auf normal zurückzusetzen.
Dies ist die beste Lösung für Windows-7-Benutzer, da timeit.exe anscheinend Windows 7 nicht unterstützt.
Für den Fall, dass Sie interne Dos-Befehle verwenden möchten (z.B.: dir, echo, del usw.), vergessen Sie nicht, "cmd /c" einzufügen: Measure-Command { cmd /c dir /s c:\windows > nul }
Wenn du
Versuche den folgenden Script in eine neue Batch-Datei zu kopieren (z.B. timecmd.bat):
@echo off
@setlocal
set start=%time%
:: Führt dein Kommando aus
cmd /c %*
set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
:: Mission erfüllt
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo Befehl dauerte %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s insgesamt)
Verwendung
Wenn du timecmd.bat in ein Verzeichnis im Pfad legst, kannst du es von überall aus wie folgt aufrufen:
timecmd [dein Befehl]
Zum Beispiel
C:\>timecmd pause
Drücken Sie eine beliebige Taste zum Fortsetzen. . .
Befehl dauerte 0:0:1.18
Wenn du die Ausgabeweiterleitung machen möchtest, kannst du den Befehl wie folgt in Anführungszeichen setzen:
timecmd "dir c:\windows /s > nul"
Dies sollte mit Befehlen umgehen können, die von vor-Mitternacht bis nach-Mitternacht laufen, aber die Ausgabe wird falsch sein, wenn dein Befehl 24 Stunden oder länger läuft.
Ersetzen von cmd /c %* durch %* funktioniert, es sei denn, Ihr Befehl ist eine andere Batch-Datei. Dann müssten Sie timecmd call other.bat ausführen.
@JesseChisholm In Windows 8 (and I've read in Windows 7 as well) you don't need the call for .bat
Aus irgendeinem Grund liefert dies nur Ausgaben in ganzen Sekunden ... was für mich nutzlos ist. Das bedeutet, dass ich timecmd pause
ausführen, und es ergibt immer 1,00 Sekunden, 2,00 Sekunden, 4,00 Sekunden ... sogar 0,00 Sekunden! Windows 7.
Hehe, die einfachste Lösung könnte diese sein:
echo %time%
YourApp.exe
echo %time%
Dies funktioniert auf jedem Windows-System von Haus aus.
Falls eine Anwendung die Konsolenausgabe verwendet, könnte es praktisch sein, die Startzeit in einer temporären Variablen zu speichern:
set startTime=%time%
YourApp.exe
echo Startzeit: %startTime%
echo Endzeit: %time%
Bist du verrückt?! Das erfordert, Mathe zu machen, so, in deinem Gehirn. Deshalb haben wir Computer erfunden, damit wir Dinge wie das vermeiden könnten.
Noch besser (wenn Ihre App Ausgaben in die Konsole spuckt): set startTime=%time% \n YourApp.exe \n echo Startzeit: %startTime% \n echo Endzeit: %time%
(Entschuldigung, konnte Zeilenumbrüche im Kommentar nicht einfügen)
Nur eine kleine Erweiterung der Antwort von Casey.K zur Verwendung des Measure-Command
von PowerShell:
Sie können PowerShell aus der Standardbefehlszeile aufrufen, so wie hier:
powershell -Command "Measure-Command {echo hi}"
Dies blockiert die Standardausgabe, aber Sie können dies verhindern, indem Sie | Out-Default
wie folgt von PowerShell hinzufügen:
Measure-Command {echo hi | Out-Default}
Oder von der Eingabeaufforderung aus:
powershell -Command "Measure-Command {echo hi | Out-Default}"
Natürlich können Sie dies auch in einer Skriptdatei *.ps1
oder *.bat
verpacken.
Wenn Sie Windows 2003 verwenden (beachten Sie, dass Windows Server 2008 und höher nicht unterstützt werden), können Sie das Windows Server 2003 Resource Kit verwenden, das timeit.exe enthält, das detaillierte Ausführungsstatistiken anzeigt. Hier ist ein Beispiel, das den Befehl "timeit -?" timet:
C:\>timeit timeit -?
Ungültiger Schalter -?
Verwendung: TIMEIT [-f Dateiname] [-a] [-c] [-i] [-d] [-s] [-t] [-k Schlüsselname | -r Schlüsselname] [-m Maske] [Befehlszeile...]
wobei: -f gibt den Namen der Datenbankdatei an, in der TIMEIT
eine Historie vorheriger Zeitmessungen aufbewahrt. Standard ist .\timeit.dat
-k gibt den Schlüsselnamen für diesen Zeitlauf an
-r gibt den Schlüsselnamen an, der aus der Datenbank entfernt werden soll. Wenn
der Schlüsselname von einem Komma und einer Zahl gefolgt wird, wird er
Entfernen Sie die langsamsten (positive Zahl) oder schnellsten (negative)
Zeiten für diesen Schlüsselnamen.
-a gibt an, dass TIMEIT den Durchschnitt aller Zeiten anzeigen soll
für den angegebenen Schlüssel.
-i gibt an, dass TIMEIT Nicht-Null-Rückgabecodes vom Programm ignorieren soll
-d gibt an, dass die Details für den Durchschnitt angezeigt werden sollen
-s gibt an, dass systemweite Zähler unterdrückt werden sollen
-t gibt an, dass tabellarische Ausgabe erfolgen soll
-c gibt an, dass eine Neueinstufung der Datenbank erzwungen werden soll
-m gibt die Prozessor-Affinitätsmaske an
Versionsnummer: Windows NT 5.2 (Build 3790)
Endzeit: 7:38 Uhr, Mittwoch, 15. April 2009
Verstrichene Zeit: 0:00:00.000
Prozesszeit: 0:00:00.015
Systemaufrufe: 731
Kontextwechsel: 299
Seitenfehler: 515
Bytes gelesen: 0
Bytes geschrieben: 0
Andere Bytes: 298
Sie können TimeIt im Windows 2003 Resource Kit erhalten. Es ist nicht direkt über das Microsoft Download Center erhältlich, aber man kann es immer noch von archive.org - Windows Server 2003 Resource Kit Tools bekommen.
Gibt es einen Weg, auch die Kernel-Zeit und/oder die Zeit, die von gestarteten Unterprozessen verwendet wird, zu messen?
FYI - Ich glaube, dass timeit auf Windows 7 64-Bit nicht funktioniert. Sie erhalten den Fehler "Es können keine Systemleistungsdaten abgefragt werden (c0000004). Verwenden Sie stattdessen PowerShells 'Measure-Command' wie Casey.K vorschlägt: stackoverflow.com/questions/673523/…
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.