Windows entspricht dem UNIX-Befehl „time“


69

Daher hat Unix einen timeBefehl, mit dem Benutzer ihren Code und andere Dinge zeitlich festlegen können. Ich habe mich gefragt, ob die Windows-Befehlszeile etwas ähnliches hat.

Auch fragte ich eine vorherige Frage nach der Linux - Befehlszeile hier . Können wir dasselbe für Windows tun? Wenn das so ist, wie?


2
Windows hat die Standard-cmd.exe, aber wenn Sie der Linux-Version etwas näher bringen wollen, holen Sie sich die PowerShell, es ist viel besser.
Guillermo Siliceo Trueba

Ich suchte nach "Befehlszeit für Windows" bei Google. Das erste Ergebnis lautet: http://stackoverflow.com/questions/673523/how-to-measure-execution-time-of-command-in-windows-command-line
David Michel

Ich arbeite unter Windows 7 und habe gerade die oben angegebene Lösung ausprobiert. Ich erhalte den folgenden Fehler: Unable to query system performance data (c0000004). Ich habe es gegoogelt und jemand anderes hatte genau das gleiche Problem, aber das Forum schlägt keine Lösung vor. Trotzdem danke für den Vorschlag. Kann jemand was für den anderen Teil vorschlagen?
efficiencyIsBliss

@eff, timeit.exe ist für Server 2003 und XP AFAIK, ich glaube nicht, dass es mit 7 kompatibel ist.
John T

Antworten:


57

Verwenden Sie PowerShell

Measure-Command {start-process whateveryouwantexecute -Wait}

Nach Ihren Wünschen bearbeitet @efficiencylsBliss:

Measure-Command {start-process java -argumentlist "whateverargumentisneeded" -wait}

Hier ist , was ich versucht: Measure-Command {java test <inputfile> -Wait}. Ich habe eine Liste mit zeitbezogenen Statistiken erhalten, aber nicht die Ausgabe des Codes. Mache ich etwas falsch?
efficiencyIsBliss

@Effizienz: Sie haben den start-processBefehl vergessen .
Sasha Chedygov

Start-Prozess: Es wurde kein Positionsparameter gefunden, der das Argument '. \ 6-8.txt' akzeptiert. In Zeile: 1 Zeichen: 31 + Measure-Command {start-process <<<< java. \ Dancebattle. \ 6-8.txt -wait} + CategoryInfo: InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound, Microsoft.PowerShell.Commands.StartProcessCommand`
efficiencyIsBliss

1
Ich versuche, die Zeit zu messen, die zum Ausführen eines Python-Skripts erforderlich ist Measure-Command {start-process \Python27\python test.py -Wait}. Dadurch wird ein neues cmd-Fenster geöffnet, in dem der Prozess ausgeführt wird. Das Fenster wird jedoch geschlossen, wenn der Vorgang abgeschlossen ist. Ich möchte auch die Ausgabe des Skripts sehen. Wie kann ich das Fenster offen halten?
John Peter Thompson Garcés

2
@ JohnPeterThompsonGarcés verwendet den Parameter -NoNewWindow des Cmdlets start-process
mjsr

21

Ich benutze Win XP aus irgendeinem Grund timeit.exenicht für mich. Ich habe eine andere Alternative gefunden ptime:

ptime 1.0 - Messen Sie die Programmausführungszeit genau

ptime führt alle angegebenen Befehle und Parameter aus und misst die Ausführungszeit (Laufzeit) in Sekunden mit einer Genauigkeit von mindestens 5 Millisekunden. Es ist ein automatischer Prozess-Timer oder Programm-Timer, der für Benchmark-Zwecke verwendet wird.


ptime hat einen kleinen Fehler. ptime gibt immer 0 als Fehlerlevel zurück, auch wenn "child" -Programm mit Fehler beendet wird
Yura Shinkarev

Super einfache und genaue Ausgabe.
20.

Scheint in Win10 gut zu funktionieren.
16.

18

Sie können ein wenig mit einem Batch-Skript betrügen ...

@echo off
echo %time% < nul
cmd /c %1
echo %time% < nul

Führen Sie dann Ihr Programm als Argument für dieses Skript aus ...

timer myprogram.exe

und für Argumente ...

Timer "myprogram.exe -sw1 -sw2"

Beispielausgabe:

17:59:20.02
some text
17:59:20.03

Platzieren Sie das Batch-Skript irgendwo in Ihrer PATH-Variablen, z . B. C:\Windows\System32und benennen Sie es timer.cmd. Natürlich gibt es einen kleinen Performance-Nachteil, wenn man eine zweite cmd-Instanz fälscht, obwohl dies sehr minimal ist.


@echo off echo %time% < nul cmd /c %1 echo %time% < nul

Es gibt kein schließendes% für Befehlszeilenparameter wie% 1. Ist es das, was du meintest?
Andrew J. Brehm

2
Warum würden Sie umleiten nul in echo ? echoliest keine Eingaben.
Joey

1
Sie können ändern , cmd /c %1zu cmd /c %*, so dass Sie Anführungszeichen für Befehlsargumente speichern können
stanleyxu2005

3

Es gibt kein direktes Äquivalent zu Unix timeunter Windows.

Die University of Georgia hat eine kurze Liste von Windows-Befehlen für Unix-Benutzer

Ich finde die ältere Windows-Eingabeaufforderung und .bat-Skripte sind im Vergleich zu Unix-Shells eher eingeschränkt, aber es gibt einige Möglichkeiten zum Durchlaufen von Dateien usw. CommandWindows.com hat einige Tipps

Sie könnten entweder bashunter Windows installieren (z. B. durch Installieren von CygWin) oder Windows Powershell lernen (von dem ich annehme, dass es die Möglichkeit hat, etwas Gleichwertiges zu tun).


2

Die Ausgabe für Ihren Code kann an eine Datei weitergeleitet werden: java test <inputfile> | Out-File d:\a.txt

Um zu messen, wie lange es dauert, müssen Sie es in Measure-Commmand einkapseln:

Measure-Commmand {java test <inputfile> | Out-File d:\a.txt}


2

Wenn Sie versuchen, PowerShell mit Measure-Command zu verwenden, müssen Sie beachten, dass möglicherweise unerwartete Probleme auftreten. Mein Befehl schreibt Binärdaten unter Verwendung der >Umleitung in eine Datei, aber PowerShell fügte dem Dateianfang eine Stückliste und nach jedem Schreiben einen Zeilenumbruch in der CRLF hinzu!


1

Ein bisschen Kaffee hat mir dabei geholfen:

function time { $Command = "$args"; Measure-Command { Invoke-Expression $Command 2>&1 | out-default} }

Und wenn Sie möchten, dass es nichts ausgibt, ersetzen Sie es einfach durch out-null:

function timequiet { $Command = "$args"; Measure-Command { Invoke-Expression $Command 2>&1 | out-null} }

Du benutzt es so:

PS C:\> time sleep 5


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 4
Milliseconds      : 990
Ticks             : 49906722
TotalDays         : 5,77624097222222E-05
TotalHours        : 0,00138629783333333
TotalMinutes      : 0,08317787
TotalSeconds      : 4,9906722
TotalMilliseconds : 4990,6722



PS C:\>

1

Zur Vereinfachung der Verwendung finden Sie hier das Schokoladenpaket: https://chocolatey.org/packages/ptime C:/> choco install ptime

Der Vorteil ptimeist, dass es sich wie die Unix-Version Measure-Command { XXX }verhält und die Konsolenausgabe liefert, was nicht der Fall ist (oder zumindest weiß ich nicht, wie das geht).


0

Es gibt verschiedene Möglichkeiten, einen Zeitbefehl abzurufen. Ich bevorzuge nur die Installation von Cygwin (die mit einem UNIX-ähnlichen timeBefehl geliefert wird).

Alternativ können Sie ein Skript schreiben und es Ihrem Pfad hinzufügen (damit Sie es ausführen können, ohne den gesamten Pfad anzugeben).

Wenn Sie Powershell zur Verfügung haben, versuchen Sie dieses Skript (funktioniert beim Aufrufen von Dateien - '. Exe' usw.):

$start = get-date
if ($args.length -gt 1) {
start-process $args[0] $args[1..$args.length] -workingdirectory $pwd -nonewwindow -wait
} else {
start-process $args[0] -workingdirectory $pwd -nonewwindow -wait
}
$end = get-date
$elapsed = $end - $start
write-host $end-$start
# datetime format
write-host $elapsed
# easy-to-read format
echo $elapsed

Führen Sie den Code aus mit (zum Beispiel):

time.ps1 python program.py

Bei Verwendung von Batch würde ich eine der Top-Antworten von hier vorschlagen (auf Stackoverflow.com) . Beide müssen nur kopiert werden. Wenn Sie die Lösung von paxdiablo verwenden , sollten Sie diese ersetzen

ping -n 11 127.0.0.1 >nul: 2>nul: 

mit

%*

0

gnomon ist eine gute Lösung, wenn Sie nicht nur die Gesamtlaufzeit eines Befehls, sondern auch eine Zeile für Zeilenmessungen benötigen:

Ein Befehlszeilendienstprogramm zum Voranstellen von Zeitstempelinformationen an die Standardausgabe eines anderen Befehls. Nützlich für lang laufende Prozesse, bei denen Sie eine historische Aufzeichnung dessen wünschen, was so lange dauert.

Installiert durch Ausführen npm install -g gnomon, dann benutze es einfach über command | gnomon.

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.