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


Antworten:


113

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 und detaillierte Ausführungsstatistiken anzeigt. Hier ist ein Beispiel für das Timing des Befehls "timeit -?":

C:\>timeit timeit -?
Invalid switch -?
Usage: TIMEIT [-f filename] [-a] [-c] [-i] [-d] [-s] [-t] [-k keyname | -r keyname] [-m mask] [commandline...]
where:        -f specifies the name of the database file where TIMEIT
                 keeps a history of previous timings.  Default is .\timeit.dat
              -k specifies the keyname to use for this timing run
              -r specifies the keyname to remove from the database.  If
                 keyname is followed by a comma and a number then it will
                 remove the slowest (positive number) or fastest (negative)
                 times for that keyname.
              -a specifies that timeit should display average of all timings
                 for the specified key.
              -i specifies to ignore non-zero return codes from program
              -d specifies to show detail for average
              -s specifies to suppress system wide counters
              -t specifies to tabular output
              -c specifies to force a resort of the data base
              -m specifies the processor affinity mask

Version Number:   Windows NT 5.2 (Build 3790)
Exit Time:        7:38 am, Wednesday, April 15 2009
Elapsed Time:     0:00:00.000
Process Time:     0:00:00.015
System Calls:     731
Context Switches: 299
Page Faults:      515
Bytes Read:       0
Bytes Written:    0
Bytes Other:      298

Sie können TimeIt im Windows 2003 Resource Kit herunterladen. Laden Sie es hier herunter .


7
Dieses Kit hat Probleme mit Windows 2008 64bit und funktioniert nicht unter 2008 R2
Artem

Gibt es eine Möglichkeit, auch die Kernelzeit und / oder die Zeit zu messen, die von gespawnten Unterprozessen verwendet wird?
Rogerdpack

38
Zu Ihrer Information: Ich glaube nicht, dass timeit unter Windows 7 64-Bit funktioniert. Sie erhalten die Fehlermeldung "Systemleistungsdaten können nicht abgefragt werden (c0000004). Verwenden Sie stattdessen den" Measure-Command "von PowerShell, wie von Casey.K vorgeschlagen: stackoverflow.com/questions/673523/…
Michael La Voie

6
In Windows 7 sehe ich "'timeit' wird nicht als interner oder externer Befehl, bedienbares Programm oder Batchdatei erkannt."
Colonel Panic

3
Ich sehe den Befehl in Windows 10 nicht und finde auch kein Resource Kit für Win 10. Weiß jemand, wie man das für 10 bekommt?
Jay Imerman

469

Alternativ verfügt Windows PowerShell über einen integrierten Befehl, der dem Befehl "time" von Bash ähnelt. Es heißt "Measure-Command". Sie müssen sicherstellen, dass PowerShell auf dem Computer installiert ist, auf dem es ausgeführt wird.

Beispiel Eingabe:

Measure-Command {echo hi}

Beispielausgabe:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 0
Ticks             : 1318
TotalDays         : 1.52546296296296E-09
TotalHours        : 3.66111111111111E-08
TotalMinutes      : 2.19666666666667E-06
TotalSeconds      : 0.0001318
TotalMilliseconds : 0.1318

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

14
Wenn 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 / sc: \ windows> nul}
LietKynes

7
Wenn Sie ein Benchmarking .exeim aktuellen Verzeichnis durchführen, verwenden Sie Folgendes : Measure-Command { .\your.exe }. PowerShell führt anscheinend keine Dinge aus, es pwdsei denn, es wird ausdrücklich dazu aufgefordert.
Cristian Diaconescu

13
Ärgerlicherweise verbirgt es sich jedoch.
Zitrax

13
Dies ist überhaupt kein Werkzeug 'ähnlich dem Zeitbefehl von Bash' . Es ist zwar schön zu wissen ... aber: Es wird nicht ausgeführt und kehrt zu<stdout> den Ergebnissen des Befehls in den geschweiften Klammern zurück!
Kurt Pfeifle

287

Falls Sie es wollen

  1. Messung der Ausführungszeit bis zur Hundertstelsekunde im Format (hh: mm: ss.ff)
  2. Sie müssen kein Ressourcenpaket herunterladen und installieren
  3. Wie ein riesiger DOS-Nerd aussehen (wer nicht)

Versuchen Sie, das folgende Skript in eine neue Batchdatei (z. B. timecmd.bat ) zu kopieren :

@echo off
@setlocal

set start=%time%

:: Runs your command
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 accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)

Verwendungszweck

Wenn Sie timecmd.bat in einem Verzeichnis in Ihrem Pfad ablegen, können Sie es von einem beliebigen Ort aus aufrufen:

timecmd [your command]

Z.B

C:\>timecmd pause
Press any key to continue . . .
command took 0:0:1.18

Wenn Sie eine Ausgabeumleitung durchführen möchten, können Sie den Befehl wie folgt zitieren:

timecmd "dir c:\windows /s > nul"

Dies sollte Befehle verarbeiten, die von vor bis nach Mitternacht ausgeführt werden. Die Ausgabe ist jedoch falsch, wenn Ihr Befehl 24 Stunden oder länger ausgeführt wird.


9
Das Ersetzen von cmd / c% * durch % * funktioniert nur, wenn Ihr Befehl eine andere Batchdatei ist. Dann müssten
Jesse Chisholm

2
@ JesseChisholm In Windows 8 (und ich habe auch in Windows 7 gelesen) brauchen Sie nicht den Anruf für .bat
Brian J

4
Aus irgendeinem Grund gibt mir das nur in ganzen Sekunden Ausgabe ... was für mich nutzlos ist. Ich meine, ich renne timecmd pauseund es ergeben sich immer 1,00 Sekunden, 2,00 Sekunden, 4,00 Sekunden ... sogar 0,00 Sekunden! Windows 7.
Camilo Martin

9
@CamiloMartin & andere, die dies hatten (wie ich) - Sie haben möglicherweise ein Gebietsschema, das COMMA anstelle von DOT als Dezimalzahl verwendet. Wechseln Sie also in diesem Skript delims=:.zu delims=:.,und dann sollte es "auf ganzer Linie " funktionieren.
Tomasz Gandor

5
Es gibt einen schwerwiegenden Rechenfehler in diesem Skript: Versuchen Sie es mit: set start=10:10:10.10 set end=10:11:10.09Und es wird ausgegeben: command took 0:1:-1.99 (59.99s total) Sie sollten die Reihenfolge der 4 Zeilen umkehren, die "lss 0" -Vergleiche durchführen, damit der Übertrag korrekt von niedrigen zu hohen sexagesimalen Ziffern fortschreitet. Dann wird die Ausgabe: command took 0:0:59.99 (59.99s total)
Jean-François Larvoire

230

Hehe, die einfachste Lösung könnte folgende sein:

echo %time%
YourApp.exe
echo %time%

Dies funktioniert unter jedem Windows sofort.


Bei einer Anwendung, die die Konsolenausgabe verwendet, kann es zweckmäßig sein, die Startzeit in einer temporären Variablen zu speichern:

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%

163
Bist du verrückt?! Dazu gehört Mathe wie in deinem Gehirn. Aus diesem Grund haben wir Computer erfunden, um solche Dinge zu vermeiden.
Luke Sampson

1
brillant! Auch wenn es für die CPU-Zeit nicht wirklich hilft
Elijah Saounkine

10
Noch besser (wenn Ihre App die Ausgabe an die Konsole spuckt): set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% (Leider konnten keine Zeilenumbrüche im Kommentar angezeigt werden)
Jono

1
@ LukeSampson, können setSie die Mathematik machen. ;-)Oh, warte, egal, das hast du unten schon getan.
Synetech

2
Nein, das ist eine schlechte Option. Hier erfahren Sie die Wanduhrzeit, nicht die CPU-Zeit. Auch wenn Ihre Befehlszeile möglicherweise nur 100 ms dauert, kann Ihre Anwendung Sekunden dauern (um das 100-fache oder mehr), wenn eine andere Anwendung die CPU belastet. Wenn Ihr Computer kaputt geht, können Sie sogar eine Minute warten, bis Ihre kleine 100-ms-App ausgeführt wird. Verfolgen Sie die CPU-Zeit, nicht die Wanduhrzeit!
Ryan Shillington

102

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

  1. Sie können PowerShell wie folgt über die Standard-Eingabeaufforderung aufrufen:

    powershell -Command "Measure-Command {echo hi}"
    
  2. Dies wird die Standardausgabe verschlingen, aber Sie können dies verhindern, indem Sie Folgendes | Out-Defaultaus PowerShell hinzufügen :

    Measure-Command {echo hi | Out-Default}
    

    Oder an einer Eingabeaufforderung:

    powershell -Command "Measure-Command {echo hi | Out-Default}"
    

Natürlich können Sie dies in eine Skriptdatei *.ps1oder einbinden *.bat.


1
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 BeispielmeasureTime.bat "c:\program files\some dir\program.exe"
GetFree

53

Der Einzeiler, den ich in Windows Server 2008 R2 verwende, ist:

cmd /v:on /c "echo !TIME! & *mycommand* & echo !TIME!"

Solange mycommand keine Anführungszeichen benötigt (was mit der Anführungszeichenverarbeitung von cmd verschraubt wird). Damit /v:onsoll ermöglicht werden, dass die beiden unterschiedlichen TIME-Werte bei der Ausführung des Befehls unabhängig voneinander und nicht einmal ausgewertet werden.


Dies funktioniert auch nicht für die "Spam" -Stapel, die das erste Mal-Label überschreiben und implizieren, dass Sie den Computer ersetzen, der die Berechnung durchführt, wie in stackoverflow.com/questions/673523/…
Val

Normalerweise können Sie Anführungszeichen ^in cmd (wie ^")
n611x007

2
Wenn Sie cmd / v: on zum zweiten Mal wiederholen, kann mycommand sogar Anführungszeichen enthalten. Beispiel : cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!.
Maarten Pennings

8
Einfacher : echo %time% & *mycommand* & call echo %^time%. Siehe auch diese Antwort .
Aacini

Wenn Ihr Befehl zu viel ausgibt, ist es vielleicht einfacher, die cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
beiden

49

Wenn Sie ein Befehlsfenster geöffnet haben und die Befehle manuell aufrufen, können Sie an jeder Eingabeaufforderung einen Zeitstempel anzeigen, z

prompt $d $t $_$P$G

Es gibt Ihnen so etwas wie:

23.03.2009 15:45:50,77

C:\>

Wenn Sie ein kleines Stapelskript haben, das Ihre Befehle ausführt, müssen Sie vor jedem Befehl eine leere Zeile einfügen, z

(leere Zeile)

myCommand.exe

(nächste leere Zeile)

myCommand2.exe

Sie können die Ausführungszeit für jeden Befehl anhand der Zeitinformationen in der Eingabeaufforderung berechnen. Am besten leiten Sie die Ausgabe zur weiteren Analyse an eine Textdatei weiter:

MyBatchFile.bat > output.txt

3
Ich dachte, ich würde ein paar Jahre hinter der Diskussion zurückbleiben, um Ihnen für das Teilen des Eingabeaufforderungsbefehls zu danken. Ich habe viele CMD-Tricks gesehen (eher ein Bash-Typ), aber dieser ist mir nicht aufgefallen.
Steve Howard

Einfach, elegant, keine Installation und kein Schreiben von Batch-Dateien für einen One-Shot-Befehl und kann jeden Schritt in einer Batch-Datei zeitlich festlegen.
Matt

26

Da andere empfehlen, Dinge wie Freeware und PowerShell zu installieren, können Sie auch Cygwin installieren , wodurch Sie auf viele grundlegende Unix-Befehle wie time zugreifen können :

abe@abe-PC:~$ time sleep 5

real    0m5.012s
user    0m0.000s
sys 0m0.000s

Ich bin mir nicht sicher, wie viel Overhead Cygwin hinzufügt.


41
Bei der Beantwortung von Windows-Fragen gilt Cygwin als Betrüger :-)
mivk

14
Er hat festgelegt, dass ResourceKit, TimeMem, ptime.exe, PowerShell und andere Dienstprogramme Benutzer zuerst zu betrügen begannen. Daher hat der Autor Ihren Kommentar unangemessen gemacht, bevor Sie ihn geschrieben haben.
Val

Ich habe dies auch positiv bewertet, da ich es als die einfachste Lösung empfand, da das kostenlose Programm Cmder bash enthält! cmder.net Denken Sie daran, dass Sie, wenn Sie Leerzeichen in Bash maskieren müssen, einen schwarzen Schrägstrich \ direkt vor dem Leerzeichen anstelle von "Anführungszeichen" verwenden. zB cd / c / Program \ Files /
lukescammell

24

Nicht ganz so elegant wie einige der Funktionen unter Unix, aber erstellen Sie eine Cmd-Datei, die wie folgt aussieht:

@echo off
time < nul
yourexecutable.exe > c:\temp\output.txt
time < nul
rem on newer windows system you can try time /T

Das zeigt die Start- und Stoppzeiten wie folgt an:

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:

2
Angenommen, Sie benötigen keine Portabilität über verschiedene Sprachen hinweg, können Sie nach "time <nul" auch einen findstr "current" oder ähnliches einfügen (nette Verwendung von nul übrigens; ich habe immer echo. | Time verwendet, aber das sieht nicht so elegant aus :)). Und verwenden Sie "für", um nur die Zeit zu extrahieren, nicht den Text.
Joey

2
Wenn Befehlserweiterungen aktiviert sind (dh die Standardeinstellung), verfügt die Win XP-Version von timeüber eine /tOption, die nur die aktuelle Systemzeit anzeigt, ohne dass Sie zur Eingabe einer neuen Zeit aufgefordert werden. Wenn Sie dies tun, werden jedoch nur Stunden und Minuten angezeigt, was für einige Verwendungen möglicherweise nicht ausreicht. (Siehe John Snow Antwort auf diese Frage.)
Martineau

3
time /Tist nur verwendbar, wenn der Prozess mehrere Minuten läuft! time < nulist hässlicher aber genauer.
PhiLho

6
Sie können auch verwenden echo %time%, das das gleiche Format und die gleiche Präzision wie time < nulbietet, aber Sie vermeiden die Enter the new time:Ausgabe ...
aschipfl


19

Ich benutze Freeware namens "GS Timer".

Erstellen Sie einfach eine Batch-Datei wie folgt:

timer
yourapp.exe
timer /s

Wenn Sie eine Reihe von Zeiten benötigen, leiten Sie einfach die Ausgabe von Timer / s in eine TXT-Datei.

Sie können es hier herunterladen : Gammadynes kostenlose DOS-Dienstprogramme


Die Auflösung beträgt 0,1 Sekunden.


4
Ich denke nicht, dass die Verwendung einer Drittanbieteranwendung in Betracht gezogen werden könnte, dies "mit Standardmitteln" zu tun.
Martineau

4
Der Fragesteller meinte "ohne Installation zusätzlicher Software", aber für die oberste (akzeptierte) Antwort muss auch ein ganzes Windows 2003 Resource Kit installiert werden! Wie auch immer, timer.exe war perfekt für das, wonach ich gerade gesucht habe, danke!
Hugo

1
Dies ist eine gepflanzte Verbindung. SoftPedia ist eine Klickfarm.
Tom A

@ Tom bitte erklären, was meinst du mit "gepflanzten Link"?
Pepoluan

10
Hier ist ein direkter Link zur eigenen Seite des Entwicklers: gammadyne.com/cmdline.htm#timer
Hugo

14

Ich verwende Windows XP und aus irgendeinem Grund funktioniert timeit.exe bei mir nicht. Ich habe eine andere Alternative gefunden - PTIME. Das funktioniert sehr gut.

http://www.pc-tools.net/win32/ptime/

Beispiel -

C:\> ptime

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

Syntax: ptime command [arguments ...]

ptime will run the specified command and measure the execution time
(run time) in seconds, accurate to 5 millisecond or better. It is an
automatic process timer, or program timer.


C:\> ptime cd

ptime 1.0 for Win32, Freeware - http://www.pc-tools.net/
Copyright(C) 2002, Jem Berkes <jberkes@pc-tools.net>

===  cd ===
C:\

Execution time: 0.015 s

Funktioniert auch unter Windows 8.1. Ich habe meine in timer.exe umbenannt, weil ich mich nie an den Namen ptime erinnern kann.
Brian Burns

11

Es gibt auch TimeMem (März 2012):

Dies ist ein Windows-Dienstprogramm, das ein Programm ausführt und dessen Ausführungszeit, Speichernutzung und E / A-Statistiken anzeigt. Die Funktionalität ähnelt dem Unix-Zeitdienstprogramm.


10

Solange es nicht länger als 24 Stunden dauert ...

@echo off

set starttime=%TIME%
set startcsec=%STARTTIME:~9,2%
set startsecs=%STARTTIME:~6,2%
set startmins=%STARTTIME:~3,2%
set starthour=%STARTTIME:~0,2%
set /a starttime=(%starthour%*60*60*100)+(%startmins%*60*100)+(%startsecs%*100)+(%startcsec%)

:TimeThis
ping localhost 

set endtime=%time%
set endcsec=%endTIME:~9,2%
set endsecs=%endTIME:~6,2%
set endmins=%endTIME:~3,2%
set endhour=%endTIME:~0,2%
if %endhour% LSS %starthour% set /a endhour+=24
set /a endtime=(%endhour%*60*60*100)+(%endmins%*60*100)+(%endsecs%*100)+(%endcsec%)

set /a timetaken= ( %endtime% - %starttime% )
set /a timetakens= %timetaken% / 100
set timetaken=%timetakens%.%timetaken:~-2%

echo.
echo Took: %timetaken% sec.

5
Beeindruckend, aber ich denke nicht, dass es funktioniert, wenn es in der Start- oder Endzeit eine 08 oder 09 gibt, da diese als Oktale interpretiert werden. Meine Antwort behandelt das :)
Luke Sampson

6

Hier ist ein

Postfix-Timer-Version:

Anwendungsbeispiel:

Zeitüberschreitung 1 | TimeIt.cmd

Execution took  ~969 milliseconds.

Kopieren Sie diese und fügen Sie sie in einen Editor wie z. B. Notepad ++ ein und speichern Sie sie als TimeIt.cmd :

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

    call :ShowHelp

    :: Set pipeline initialization time
    set t1=%time%

    :: Wait for stdin
    more

    :: Set time at which stdin was ready
    set t2=!time!


    :: Calculate difference
    Call :GetMSeconds Tms1 t1
    Call :GetMSeconds Tms2 t2

    set /a deltaMSecs=%Tms2%-%Tms1%
    echo Execution took ~ %deltaMSecs% milliseconds.

    endlocal
goto :eof

:GetMSeconds
    Call :Parse        TimeAsArgs %2
    Call :CalcMSeconds %1 %TimeAsArgs%

goto :eof

:CalcMSeconds
    set /a %1= (%2 * 3600*1000) + (%3 * 60*1000) + (%4 * 1000) + (%5)
goto :eof

:Parse

    :: Mask time like " 0:23:29,12"
    set %1=!%2: 0=0!

    :: Replace time separators with " "
    set %1=!%1::= !
    set %1=!%1:.= !
    set %1=!%1:,= !

    :: Delete leading zero - so it'll not parsed as octal later
    set %1=!%1: 0= !
goto :eof

:ShowHelp
    echo %~n0 V1.0 [Dez 2015]
    echo.
    echo Usage: ^<Command^> ^| %~nx0
    echo.
    echo Wait for pipe getting ready... :)
    echo  (Press Ctrl+Z ^<Enter^> to Cancel)
goto :eof

^ - Basierend auf der 'Daniel Sparks'-Version


5

Eine Alternative zur Messzeit ist einfach "Get-Date". Sie haben diesen Ärger mit der Weiterleitungsausgabe und so weiter nicht.

$start = Get-Date
[System.Threading.Thread]::Sleep(1500)
$(Get-Date) - $start

Ausgabe:

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 1
Milliseconds      : 506
Ticks             : 15060003
TotalDays         : 1.74305590277778E-05
TotalHours        : 0.000418333416666667
TotalMinutes      : 0.025100005
TotalSeconds      : 1.5060003
TotalMilliseconds : 1506.0003

Das war perfekt für mich
Brett Rowberry

4

Dies ist ein Einzeiler, der eine verzögerte Expansion vermeidet , die bestimmte Befehle stören könnte:

cmd /E /C "prompt $T$$ & echo.%TIME%$ & COMMAND_TO_MEASURE & for %Z in (.) do rem/ "

Die Ausgabe ist so etwas wie:

14:30:27.58$
...
14:32:43.17$ rem/ 

Für langfristige ersetzen Tests $Tdurch $D, $Tund %TIME%durch %DATE%, %TIME%das Datum enthalten.

Um dies in einer Batchdatei zu verwenden , ersetzen Sie %Zdurch %%Z.


Aktualisieren

Hier ist ein verbesserter Einzeiler (auch ohne verzögerte Erweiterung ):

cmd /E /C "prompt $D, $T$$ & (for %# in (.) do rem/ ) & COMMAND_TO_MEASURE & for %# in (.) do prompt"

Die Ausgabe sieht ungefähr so ​​aus:

2015/09/01, 14:30:27.58$ rem/ 
...
2015/09/01, 14:32:43.17$ prompt

Dieser Ansatz beinhaltet weder den Prozess der Instanziierung eines neuen cmdim Ergebnis noch die promptBefehle.


4

Abhängig von der verwendeten Windows-Version werden Sie durch einfaches Ausführen bashin den Bash-Modus versetzt. Auf diese Weise können Sie eine Reihe von Befehlen verwenden, die in PowerShell nicht direkt verfügbar sind (wie der timeBefehl). Das Timing Ihres Befehls ist jetzt so einfach wie das Ausführen von:

# The clause <your-command> (without the angle brackets) denotes the command you want to run.
$ time <your-command>

Hinweis: Sie können den Bash-Modus einfach verlassen und in Ihre Mainstream-Shell zurückkehren, exitindem Sie ihn im Bash-Modus ausführen.

Dies funktionierte perfekt für mich (Windows 10), nachdem ich andere Methoden (wie Measure-Command) ausprobiert hatte, die manchmal unerwünschte Statistiken erzeugen. Hoffe das funktioniert auch bei dir.


2
Ab Windows 10 1607 die beste Antwort.
CarpeDiemKopi

2

Falls jemand anderes hierher gekommen ist, um eine Antwort auf diese Frage zu finden, gibt es eine Windows-API-Funktion namens GetProcessTimes(). Es sieht nicht nach zu viel Arbeit aus, ein kleines C-Programm zu schreiben, das den Befehl startet, diesen Aufruf ausführt und die Prozesszeiten zurückgibt.


3
Es scheint nicht zu viel Arbeit zu sein, ein kleines C-Programm herunterzuladen, das den Befehl startet, diesen Aufruf (und viel mehr Vormessungen) ausführt und die Prozesszeiten zurückgibt.
Elazar Leibovich

@ ElzarLeibovich Powershell? Sie können es von C # aus aufrufen.
KeyWeeUsr

@KeyWeeUsr können Sie Windows API IIRC von PS blogs.technet.microsoft.com/heyscriptingguy/2013/06/25/…
Elazar Leibovich

2

Dies ist ein Kommentar / eine Bearbeitung zu Luke Sampsons Nizza timecmd.batund Antwort auf

Aus irgendeinem Grund gibt mir das nur in ganzen Sekunden Ausgabe ... was für mich nutzlos ist. Ich meine, dass ich timecmd Pause laufen lasse und es immer zu 1,00 Sekunden, 2,00 Sekunden, 4,00 Sekunden führt ... sogar 0,00 Sekunden! Windows 7. - Camilo Martin 25. September 13 um 16:00 "

Bei einigen Konfigurationen können die Trennzeichen unterschiedlich sein. Die folgende Änderung sollte mindestens die meisten westlichen Länder abdecken.

set options="tokens=1-4 delims=:,." (added comma)

Das %time% Millisekunden funktionieren auf meinem System, nachdem das ',' hinzugefügt wurde.

(* weil die Site keinen Kommentar zulässt und die Identität nicht gut verfolgt, obwohl ich immer dieselbe Gast-E-Mail verwende, die in Kombination mit IPv6-IP und Browser-Fingerabdruck ausreichen sollte, um sich ohne Passwort eindeutig zu identifizieren)


Ich habe genau das kommentiert, bevor ich zu Ihrer Antwort gescrollt habe. Wie auch immer, Lukes Skript könnte Stunden, Minuten und Sekunden auf Null setzen, nicht nur die Subsekunden (die Centisekunden und nicht Millisekunden sind, übrigens ). Siehe hier: en.wiktionary.org/wiki/centisecond
Tomasz Gandor

2

Hier ist meine Methode, keine Konvertierung und keine ms. Es ist nützlich, die Codierungsdauer zu bestimmen (jedoch auf 24 Stunden begrenzt):

@echo off

:start
REM Start time storage
set ST=%time%
echo Process started at %ST%
echo.
echo.

REM Your commands
REM Your commands
REM Your commands

:end
REM Start Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%ST%") do set /a h1=%%a & set /a m1=%%b & set /a s1=%%c

REM End Time Definition
for /f "tokens=1-3 delims=:" %%a in ("%TIME%") do set /a h2=%%a & set /a m2=%%b & set /a s2=%%c

REM Difference
set /a h3=%h2%-%h1% & set /a m3=%m2%-%m1% & set /a s3=%s2%-%s1%

REM Time Adjustment
if %h3% LSS 0 set /a h3=%h3%+24
if %m3% LSS 0 set /a m3=%m3%+60 & set /a h3=%h3%-1
if %s3% LSS 0 set /a s3=%s3%+60 & set /a m3=%m3%-1

echo Start    :    %ST%
echo End    :    %time%
echo.
echo Total    :    %h3%:%m3%:%s3%
echo.
pause

1
@echo off & setlocal

set start=%time%

REM Do stuff to be timed here.
REM Alternatively, uncomment the line below to be able to
REM pass in the command to be timed when running this script.
REM cmd /c %*

set end=%time%

REM Calculate time taken in seconds, to the hundredth of a second.
REM Assumes start time and end time will be on the same day.

set options="tokens=1-4 delims=:."

for /f %options% %%a in ("%start%") do (
    set /a start_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
    set /a start_hs=100%%d %% 100
)

for /f %options% %%a in ("%end%") do (
    set /a end_s="(100%%a %% 100)*3600 + (100%%b %% 100)*60 + (100%%c %% 100)"
    set /a end_hs=100%%d %% 100
)

set /a s=%end_s%-%start_s%
set /a hs=%end_hs%-%start_hs%

if %hs% lss 0 (
    set /a s=%s%-1
    set /a hs=100%hs%
)
if 1%hs% lss 100 set hs=0%hs%

echo.
echo  Time taken: %s%.%hs% secs
echo.

Funktioniert nicht. Erhalten: Unausgeglichene Klammern. Unausgeglichene Klammern. Fehlender Operand.
Richard Sandoz

@RichardSandoz Es funktioniert gut, es gibt keine unausgeglichenen Klammern. Wie benutzt du es?
MikeM

1

Das folgende Skript verwendet nur "cmd.exe" und gibt die Anzahl der Millisekunden vom Erstellen einer Pipeline bis zum Beenden des Prozesses vor dem Skript aus. Geben Sie also Ihren Befehl ein und leiten Sie ihn an das Skript weiter. Beispiel: "timeout 3 | runtime.cmd" sollte ungefähr "2990" ergeben. Wenn Sie sowohl die Laufzeitausgabe als auch die stdin-Ausgabe benötigen, leiten Sie stdin vor der Pipe um - Beispiel: "dir / s 1> temp.txt | runtime.cmd" würde die Ausgabe des Befehls "dir" in "temp.txt" ausgeben. und würde die Laufzeit auf der Konsole drucken.

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

:: find target for recursive calls
if not "%1"=="" (
    shift /1
    goto :%1
    exit /b
)

:: set pipeline initialization time
set t1=%time%

:: wait for stdin
more > nul

:: set time at which stdin was ready
set t2=!time!

::parse t1
set t1=!t1::= !
set t1=!t1:.= !
set t1=!t1: 0= !

:: parse t2
set t2=!t2::= !
set t2=!t2:.= !
set t2=!t2: 0= !

:: calc difference
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

Anstatt das Skript rekursiv aufzurufen , sollten Sie es so machen call :calc. Das habe ich hier gemacht. Link Code wird auf diese Weise etwas schöner. : D
Nadu

Fehler Nr. 1 wird in der 12. Stunde fehlschlagen. Beispiel: " 0 : 23: 19,42" Fehler Nr. 2 schlägt fehl, wenn der Dezimalpunkt etwas anderes als ist. Gleiches Beispiel: "0:23:19 , 42" hier ist der Dezimalpunkt, <__________> Gut versucht zu bearbeiten, aber dieser dumme **** in der 'Bearbeitungsgenehmigungskommission' hat es abgelehnt - 3 von 5 stimmten "Diese Änderung ändert sich auch ein Großteil der ursprünglichen Absicht des Autors. " Wenn Sie also Lust haben, Ihr Glück zu bearbeiten, oder die Fehler einfach in den Griff bekommen, bleibt die ursprüngliche Absicht des Autors erhalten. Gesichtspalme
Nadu

Es können keine Millisekunden ausgegeben werden, wenn die Auflösung Ihrer Uhr kaum eine Auflösung von 1/100 Sekunden erreicht.
Jwdonahue

1

Die Antwort von driblio kann etwas kürzer gemacht werden (obwohl nicht viel lesbar)

@echo off

:: Calculate the start timestamp
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _started=_hours*60*60*100+_min*60*100+_sec*100+_cs


:: yourCommandHere


:: Calculate the difference in cSeconds
set _time=%time%
set /a _hours=100%_time:~0,2%%%100,_min=100%_time:~3,2%%%100,_sec=100%_time:~6,2%%%100,_cs=%_time:~9,2%
set /a _duration=_hours*60*60*100+_min*60*100+_sec*100+_cs-_started

:: Populate variables for rendering (100+ needed for padding)
set /a _hours=_duration/60/60/100,_min=100+_duration/60/100%%60,_sec=100+(_duration/100%%60%%60),_cs=100+_duration%%100

echo Done at: %_time% took : %_hours%:%_min:~-2%:%_sec:~-2%.%_cs:~-2%

::prints something like:
::Done at: 12:37:53,70 took: 0:02:03.55

Nach der Bemerkung von Luke Sampson ist diese Version oktalsicher, obwohl die Aufgabe in 24 Stunden erledigt sein sollte.


Funktioniert nicht. Fehlender Operator bei einstelliger Stunde.
Richard Sandoz

set _time=%time: =0%behebt das einstellige Stundenproblem - an beiden Stellen ersetzen.
Laur

1
  1. Geben Sie in dem Verzeichnis, in dem sich Ihr Programm befindet, notepad mytimer.batauf "Ja" ein, um eine neue Datei zu erstellen.

  2. Fügen Sie den folgenden Code ein, ersetzen Sie ihn YourApp.exedurch Ihr Programm und speichern Sie ihn.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. Geben Sie mytimer.batin der Befehlszeile und drücken Sie die Eingabetaste.


7
time / t gibt dir nur Zeit in HH: MM. Um eine ausführbare Datei zeitlich abzustimmen, benötigen Sie normalerweise mehr Genauigkeit ... Können Sie sie so einrichten, dass sie auf Sekundenbruchteile reduziert wird? Ich habe die Sollution von JohnW getestet (Zeit <nul), und das gibt die Zeit tatsächlich auf 1 / 100s: HH: MM: SS.XX
Ehrfurcht

1

Mein Code gibt Ihnen die Laufzeit in Millisekunden bis zu 24 Stunden an. Er ist unempfindlich gegen das Gebietsschema und berücksichtigt negative Werte, wenn der Code bis Mitternacht läuft. Es verwendet eine verzögerte Erweiterung und sollte in einer cmd / bat-Datei gespeichert werden.

vor Ihrem Code:

SETLOCAL EnableDelayedExpansion

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t1 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t1=!t1!%t:~15,3%

nach deinem Code:

for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /format:list') do set t=%%I
set /a t2 = %t:~8,1%*36000 + %t:~9,1%*3600 + %t:~10,1%*600 + %t:~11,1%*60 + %t:~12,1%*10 + %t:~13,1% && set t2=!t2!%t:~15,3%
set /a t2-=t1 && if !t2! lss 0 set /a t2+=24*3600000

Wenn Sie eine Laufzeit im Format HH: mm: ss.000 wünschen, fügen Sie Folgendes hinzu:

set /a "h=t2/3600000,t2%%=3600000,m=t2/60000,t2%%=60000" && set t2=00000!t2!&& set t2=!t2:~-5!
if %h% leq 9 (set h=0%h%) && if %m% leq 9 (set m=0%m%)
set t2=%h%:%m%:%t2:~0,2%.%t2:~2,3%

ENDLOCAL

Variable t2hält Ihre Laufzeit, Sie können echo %t2%es anzeigen.


1

Nachdem Perl die verfügbare Mietlösung installiert hat, führen Sie Folgendes aus:

C:\BATCH>time.pl "echo Fine result"
0.01063
Fine result

STDERR kommt vor gemessenen Sekunden

#!/usr/bin/perl -w

use Time::HiRes qw();
my $T0 = [ Time::HiRes::gettimeofday ];

my $stdout = `@ARGV`;

my $time_elapsed = Time::HiRes::tv_interval( $T0 );

print $time_elapsed, "\n";
print $stdout;

0

Verwenden eines U-Bootes, um die Zeit in Hundertstelsekunden zurückzugeben

::tiemeit.cmd
@echo off
Setlocal EnableDelayedExpansion

call :clock 

::call your_command  or more > null to pipe this batch after your_command

call :clock

echo %timed%
pause
goto:eof

:clock
if not defined timed set timed=0
for /F "tokens=1-4 delims=:.," %%a in ("%time%") do ( 
set /A timed = "(((1%%a - 100) * 60 + (1%%b - 100)) * 60 + (1%%c - 100))  * 100 + (1%%d - 100)- %timed%"
)
goto:eof

0

"Lean and Mean" TIMER mit Regionalformat, 24h und Unterstützung für gemischte Eingaben
Anpassung von Aacini Substitutionsmethoden-Body, keine IFs, nur ein FOR (mein regionaler Fix)

1: Die Datei timer.bat befindet sich irgendwo in% PATH% oder im aktuellen Verzeichnis

@echo off & rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!"     & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof

Verwendung:
Timer & Echo start_cmds & timeout / t 3 & echo end_cmds & timer
timer & timer "23: 23: 23,00"
timer "23: 23: 23,00" & timer
timer "13.23.23,00" & timer "03: 03: 03.00"
Timer & Timer "0: 00: 00.00" no & cmd / v: on / c Echo bis Mitternacht =! Timer_end!
Die Eingabe kann jetzt gemischt werden, um die unwahrscheinlichen, aber möglichen Änderungen des Zeitformats während der Ausführung zu berücksichtigen

2: Funktion : Timer , der mit dem Batch-Skript gebündelt ist (Beispielverwendung unten):

@echo off
set "TIMER=call :timer" & rem short macro
echo.
echo EXAMPLE:
call :timer
timeout /t 3 >nul & rem Any process here..
call :timer
echo.
echo SHORT MACRO:
%TIMER% & timeout /t 1 & %TIMER% 
echo.
echo TEST INPUT:
set "start=22:04:04.58"
set "end=04.22.44,22"
echo %start% ~ start & echo %end% ~ end
call :timer "%start%"
call :timer "%end%"
echo.
%TIMER% & %TIMER% "00:00:00.00" no 
echo UNTIL MIDNIGHT: %timer_end%
echo.
pause 
exit /b

:: Um es zu testen, kopieren Sie die obigen und unteren Codeabschnitte

rem :AveYo: compact timer function with Regional format, 24-hours and mixed input support 
:timer Usage " call :timer [input - optional] [no - optional]" :i Result printed on second call, saved to timer_end 
if not defined timer_set (if not "%~1"=="" (call set "timer_set=%~1") else set "timer_set=%TIME: =0%") & goto :eof
(if not "%~1"=="" (call set "timer_end=%~1") else set "timer_end=%TIME: =0%") & setlocal EnableDelayedExpansion
for /f "tokens=1-6 delims=0123456789" %%i in ("%timer_end%%timer_set%") do (set CE=%%i&set DE=%%k&set CS=%%l&set DS=%%n)
set "TE=!timer_end:%DE%=%%100)*100+1!"     & set "TS=!timer_set:%DS%=%%100)*100+1!"
set/A "T=((((10!TE:%CE%=%%100)*60+1!%%100)-((((10!TS:%CS%=%%100)*60+1!%%100)" & set/A "T=!T:-=8640000-!"
set/A "cc=T%%100+100,T/=100,ss=T%%60+100,T/=60,mm=T%%60+100,hh=T/60+100"
set "value=!hh:~1!%CE%!mm:~1!%CE%!ss:~1!%DE%!cc:~1!" & if "%~2"=="" echo/!value!
endlocal & set "timer_end=%value%" & set "timer_set=" & goto :eof

CE, DE und CS, DS stehen für Doppelpunktende, Punktende und Doppelpunktsatz, Punktsatz - werden für die Unterstützung gemischter Formate verwendet


0

Das folgende Skript emuliert die * nix-Epochenzeit, ist jedoch lokal und regional. Es sollte Kalenderkantenfälle einschließlich Schaltjahren behandeln. Wenn Cygwin verfügbar ist, können Epochenwerte durch Angabe der Option Cygwin verglichen werden .

Ich bin in EST und der gemeldete Unterschied beträgt 4 Stunden, was relativ korrekt ist. Es gibt einige interessante Lösungen, um die TZ und regionale Abhängigkeiten zu beseitigen, aber nichts Triviales, das mir aufgefallen ist.

@ECHO off
SETLOCAL EnableDelayedExpansion

::
::  Emulates local epoch seconds
::

:: Call passing local date and time
CALL :SECONDS "%DATE%" "%TIME%"
IF !SECONDS! LEQ 0 GOTO END

:: Not testing - print and exit
IF NOT "%~1"=="cygwin" (
    ECHO !SECONDS!
    GOTO END
)

:: Call on Cygwin to get epoch time
FOR /F %%c IN ('C:\cygwin\bin\date +%%s') DO SET EPOCH=%%c

:: Show the results
ECHO Local Seconds: !SECONDS!
ECHO Epoch Seconds: !EPOCH!

:: Calculate difference between script and Cygwin
SET /A HOURS=(!EPOCH!-!SECONDS!)/3600
SET /A FRAC=(!EPOCH!-!SECONDS!)%%3600

:: Delta hours shown reflect TZ
ECHO Delta Hours: !HOURS! Remainder: !FRAC!

GOTO END

:SECONDS
SETLOCAL  EnableDelayedExpansion

    :: Expecting values from caller
    SET DATE=%~1
    SET TIME=%~2

    :: Emulate Unix epoch time without considering TZ
    SET "SINCE_YEAR=1970"

    :: Regional constraint! Expecting date and time in the following formats:
    ::   Sun 03/08/2015   Day MM/DD/YYYY
    ::   20:04:53.64         HH:MM:SS
    SET VALID_DATE=0
    ECHO !DATE! | FINDSTR /R /C:"^... [0-9 ][0-9]/[0-9 ][0-9]/[0-9][0-9][0-9][0-9]" > nul && SET VALID_DATE=1
    SET VALID_TIME=0
    ECHO !TIME! | FINDSTR /R /C:"^[0-9 ][0-9]:[0-9 ][0-9]:[0-9 ][0-9]" > nul && SET VALID_TIME=1
    IF NOT "!VALID_DATE!!VALID_TIME!"=="11" (
        IF !VALID_DATE! EQU 0  ECHO Unsupported Date value: !DATE! 1>&2
        IF !VALID_TIME! EQU 0  ECHO Unsupported Time value: !TIME! 1>&2
        SET SECONDS=0
        GOTO SECONDS_END
    )

    :: Parse values
    SET "YYYY=!DATE:~10,4!"
    SET "MM=!DATE:~4,2!"
    SET "DD=!DATE:~7,2!"
    SET "HH=!TIME:~0,2!"
    SET "NN=!TIME:~3,2!"
    SET "SS=!TIME:~6,2!"
    SET /A YEARS=!YYYY!-!SINCE_YEAR!
    SET /A DAYS=!YEARS!*365

    :: Bump year if after February  - want leading zeroes for this test
    IF "!MM!!DD!" GEQ "0301" SET /A YEARS+=1

    :: Remove leading zeros that can cause octet probs for SET /A
    FOR %%r IN (MM,DD,HH,NN,SS) DO (
        SET "v=%%r"
        SET "t=!%%r!"
        SET /A N=!t:~0,1!0
        IF 0 EQU !N! SET "!v!=!t:~1!"
    )

    :: Increase days according to number of leap years
    SET /A DAYS+=(!YEARS!+3)/4-(!SINCE_YEAR!%%4+3)/4

    :: Increase days by preceding months of current year
    FOR %%n IN (31:1,28:2,31:3,30:4,31:5,30:6,31:7,31:8,30:9,31:10,30:11) DO (
        SET "n=%%n"
        IF !MM! GTR !n:~3! SET /A DAYS+=!n:~0,2!
    )

    :: Multiply and add it all together
    SET /A SECONDS=(!DAYS!+!DD!-1)*86400+!HH!*3600+!NN!*60+!SS!

:SECONDS_END
ENDLOCAL & SET "SECONDS=%SECONDS%"
GOTO :EOF

:END
ENDLOCAL

Neugierig auf die Ablehnung. Vielen Dank.
bvj

0

Eine Lösung mit reinem PHP für cmd und eine env. Variable:

@echo off
setlocal enableextensions

REM set start time env var
FOR /F "tokens=* USEBACKQ" %%F IN (`php -r "echo microtime(true);"`) DO ( SET start_time=%%F )

## PUT_HERE_THE_COMMAND_TO_RUN ##

REM echo elapsed time
php -r "echo 'elapsed: ' . (round(microtime(true) - trim(getenv('start_time')), 2)) . ' seconds' . mb_convert_encoding('&#13;&#10;', 'UTF-8', 'HTML-ENTITIES');"
  • Keine Notwendigkeit für Cygwin oder nicht vertrauenswürdige Dienstprogramme. Nützlich, wenn PHP lokal verfügbar ist

  • Präzision und Ausgabeformat können leicht angepasst werden

  • Die gleiche Idee kann für PowerShell portiert werden

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.