663 Stimmen

Wie messe ich die Ausführungszeit eines Befehls auf der Windows-Befehlszeile?

Gibt es eine integrierte Möglichkeit, die Ausführungszeit eines Befehls in der Windows-Befehlszeile zu messen?

667voto

Casey.K Punkte 5899

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.

23 Stimmen

Dies ist die beste Lösung für Windows-7-Benutzer, da timeit.exe anscheinend Windows 7 nicht unterstützt.

16 Stimmen

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 }

0 Stimmen

Wie führt man es aus einer externen Anwendung aus, die Shell-Befehle ausführen kann?

385voto

Wenn du

  1. Die Ausführungszeit bis auf ein Hundertstel einer Sekunde messen möchtest (im Format hh:mm:ss.ff)
  2. Kein Ressourcenpaket herunterladen und installieren möchtest
  3. Wie ein großer DOS-Nerd aussehen möchtest (wer nicht)

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.

11 Stimmen

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.

2 Stimmen

@JesseChisholm In Windows 8 (and I've read in Windows 7 as well) you don't need the call for .bat

4 Stimmen

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.

281voto

LietKynes Punkte 2790

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%

194 Stimmen

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.

2 Stimmen

Ausgezeichnet! Auch wenn es für die CPU-Zeit nicht wirklich hilft

13 Stimmen

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)

130voto

Vladimir Veljkovic Punkte 1387

Nur eine kleine Erweiterung der Antwort von Casey.K zur Verwendung des Measure-Command von PowerShell:

  1. Sie können PowerShell aus der Standardbefehlszeile aufrufen, so wie hier:

    powershell -Command "Measure-Command {echo hi}"
  2. 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.

2 Stimmen

Was ist, wenn der Befehl, den wir messen möchten, Anführungszeichen enthält? Kann dies in diesem Fall in ein .bat-Skript umgewandelt werden? Zum Beispiel measureTime.bat "c:\program files\some dir\program.exe"

123voto

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.

8 Stimmen

Dieses Kit hat Probleme mit Windows 2008 64-Bit und funktioniert nicht auf 2008 R2.

0 Stimmen

Gibt es einen Weg, auch die Kernel-Zeit und/oder die Zeit, die von gestarteten Unterprozessen verwendet wird, zu messen?

43 Stimmen

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.com

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.

Powered by:

X