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?

3voto

Jeff Pratt Punkte 1573

Falls sich noch jemand hierher verirrt hat, der eine Antwort auf diese Frage sucht, gibt es eine Windows-API-Funktion namens GetProcessTimes(). Es scheint nicht allzu viel Arbeit zu sein, ein kleines C-Programm zu schreiben, das den Befehl startet, diesen Aufruf macht und die Prozesszeiten zurückgibt.

4 Stimmen

Es scheint nicht allzu viel Arbeit zu sein, ein kleines C-Programm herunterzuladen, das den Befehl startet, diesen Aufruf durchführt (und viele weitere fortgeschrittene Messungen durchführt) und die Prozesszeiten zurückgibt.

0 Stimmen

@ElazarLeibovich powershell? Sie können es von C# aus aufrufen.

0 Stimmen

@KeyWeeUsr Sie können meines Wissens nach die Windows-API von PS aus verwenden blogs.technet.microsoft.com/heyscriptingguy/2013/06/25/…

3voto

  1. Im Verzeichnis, in dem sich Ihr Programm befindet, geben Sie notepad mytimer.bat ein, klicken Sie auf 'Ja', um eine neue Datei zu erstellen.

  2. Fügen Sie den folgenden Code ein, ersetzen Sie YourApp.exe durch Ihr Programm und speichern Sie dann.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. Geben Sie mytimer.bat in die Befehlszeile ein und drücken Sie dann die Eingabetaste.

7 Stimmen

Time /t gibt Ihnen nur die Zeit in HH:MM. Um die Ausführungszeit einer Anwendung zu messen, benötigen Sie normalerweise mehr Genauigkeit ... Gibt es irgendetwas, das Sie einrichten können, um auf Bruchteile einer Sekunde zu kommen? Ich habe die Lösung von JohnW getestet (time < nul), und das gibt tatsächlich die Zeit auf 1/100s genau aus: HH:MM:SS.XX

2voto

Dies ist ein Kommentar/Bearbeitung zu Lukas Sampsons schönem timecmd.bat und eine Antwort auf

Aus irgendeinem Grund gibt mir das nur Ausgabe in ganzen Sekunden... was für mich nutzlos ist. Ich meine, ich führe timecmd pause aus, und es ergibt immer 1,00 Sekunde, 2,00 Sekunden, 4,00 Sekunden... sogar 0,00 Sekunden! Windows 7. – Camilo Martin 25. Sep '13 um 16:00 "

Bei einigen Konfigurationen können sich die Trennzeichen unterscheiden. Die folgende Änderung sollte zumindest die meisten westlichen Länder abdecken.

set options="tokens=1-4 delims=:," (Komma hinzugefügt)

Die Millisekunden von %time% funktionieren auf meinem System, nachdem das ',' hinzugefügt wurde

(*weil die Seite anonyme Kommentare nicht erlaubt und keine gute Erfassung der Identität durchführt, obwohl ich immer dieselbe Gäste-E-Mail-Adresse verwende, die in Kombination mit der IPv6-IP und dem Browserfingerabdruck ausreichen sollte, um ohne Passwort eindeutig identifiziert zu werden)

0 Stimmen

Ich habe das gerade kommentiert, bevor ich zu deiner Antwort gescrollt habe. Jedenfalls konnte Lukes Skript nicht nur die Subsekunden (die Zehntelsekunden sind, und nicht Millisekunden, übrigens) nullen. Siehe hier: en.wiktionary.org/wiki/centisecond

2voto

npocmaka Punkte 52753

Ein weiterer Ansatz mit Powershell:

@echo off
for /f %%t in ('powershell "(get-date).tofiletime()"') do set mst=%%t

rem some commands

powershell ((get-date).tofiletime() - %mst%)

Dies wird die Ausführungszeit in Millisekunden ausgeben.

1voto

Daniel Sparks Punkte 65

Das folgende Skript verwendet nur "cmd.exe" und gibt die Anzahl der Millisekunden von dem Zeitpunkt an, an dem eine Pipeline erstellt wird, bis zum Zeitpunkt, an dem der Prozess vor dem Skript beendet wird. D.h. Geben Sie Ihren Befehl ein und leiten Sie ihn an das Skript weiter. Beispiel: "timeout 3 | runtime.cmd" sollte etwas wie "2990" ergeben. Wenn Sie sowohl die Laufzeitausgabe als auch die Standardausgabe benötigen, leiten Sie die Standardausgabe vor dem Pipe um - z.B. "dir /s 1>temp.txt | runtime.cmd" würde die Ausgabe des "dir" Befehls in "temp.txt" umleiten und die Laufzeit in die Konsole drucken.

:: --- runtime.cmd ----
@echo off
setlocal enabledelayedexpansion

:: Ziel für rekursive Aufrufe finden
if not "%1"=="" (
    shift /1
    goto :%1
    exit /b
)

:: Setzen der Pipeline-Initialisierungszeit
set t1=%time%

:: Warten auf Standardeingabe
more > nul

:: Setzen der Zeit, zu der die Standardeingabe bereit war
set t2=!time!

:: t1 analysieren
set t1=!t1::= !
set t1=!t1:.= !
set t1=!t1: 0= !

:: t2 analysieren
set t2=!t2::= !
set t2=!t2:.= !
set t2=!t2: 0= !

:: Differenz berechnen
pushd %~dp0
for /f %%i in ('%0 calc !t1!') do for /f %%j in ('%0 calc !t2!') do (
    set /a t=%%j-%%i
    echo !t!
)
popd
exit /b
goto :eof

:calc
set /a t=(%1*(3600*1000))+(%2*(60*1000))+(%3*1000)+(%4)
echo !t!
goto :eof

endlocal

0 Stimmen

Anstatt das Skript rekursiv aufzurufen, sollten Sie es so machen: call :calc. Das habe ich hier gemacht. link Der Code wird dadurch etwas übersichtlicher. :D

0 Stimmen

Fehler #1 Wird in der 12. Stunde scheitern. Beispiel: "0:23:19,42" Fehler #2 Wird fehlschlagen, wenn der Dezimalpunkt nicht . ist. dasselbe Beispiel: "0:23:19 , 42" hier ist der Dezimalpunkt , <__________> Nun, ich habe versucht zu bearbeiten, aber dieser Dummkopf in der 'Bearbeitungsgenehmigungskommission' hat es abgelehnt - 3 von 5 haben dafür gestimmt, dass "Diese Bearbeitung ändert zu viel von der ursprünglichen Absicht des Autors". also wenn du denkst, dass du dein Glück beim Bearbeiten versuchen willst oder einfach die Fehler drin behalten willst - damit die 'ursprüngliche Absicht des Autors intakt bleibt'. facepalm

0 Stimmen

Kann Millisekunden nicht anzeigen, wenn die Auflösung Ihrer Uhr kaum eine Auflösung von 1/100 Sekunde ermöglicht.

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