Windows odpowiada komendzie „time” w systemie UNIX


69

Tak więc Unix ma timepolecenie, które pozwala użytkownikom na czas ich kodu / innych rzeczy. Zastanawiałem się, czy wiersz poleceń systemu Windows ma coś podobnego.

Zadałem również poprzednie pytanie dotyczące wiersza poleceń systemu Linux tutaj . Czy możemy zrobić to samo dla systemu Windows? Jeśli tak to jak?


2
Windows ma standardowy cmd.exe, ale jeśli chcesz coś bliższego wersji linux, skorzystaj z PowerShell, to jest o wiele lepszy.
Guillermo Siliceo Trueba

Szukałem „czas polecenia dla systemu Windows” w Google przy pierwszym wyniku daje: http://stackoverflow.com/questions/673523/how-to-measure-execution-time-of-command-in-windows-command-line
David Michel

Korzystam z systemu Windows 7 i właśnie wypróbowałem powyższe rozwiązanie. Pojawia się następujący błąd: Unable to query system performance data (c0000004). Poszukałem go i ktoś inny miał dokładnie ten sam problem, ale forum sugeruje brak rozwiązania. W każdym razie dziękuję za sugestię. Czy ktoś może zasugerować coś innego?
wydajność

@eff, timeit.exe jest dla serwera 2003 i XP AFAIK, nie sądzę, że jest kompatybilny z 7.
John T

Odpowiedzi:


57

Użyj PowerShell

Measure-Command {start-process whateveryouwantexecute -Wait}

Edytowane do twoich potrzeb @fficiencylsBliss:

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

Oto, co starałem: Measure-Command {java test <inputfile> -Wait}. Mam listę statystyk związanych z czasem, ale nie danych wyjściowych z kodu. czy robię coś źle?
Wydajność

@ skuteczność: Zapomniałeś start-processpolecenia.
Sasha Chedygov

Rozpoczęcie procesu: Nie można znaleźć parametru pozycyjnego, który akceptuje argument „. \ 6-8.txt”. W wierszu: 1 znak: 31 + Measure-Command {start-process <<<< java. \ Dancebattle. \ 6-8.txt -wait} + CategoryInfo: InvalidArgument: (:) [Start-Process], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound, Microsoft.PowerShell.Commands.StartProcessCommand`
efektywnośćIsBliss

1
Próbuję zmierzyć czas potrzebny do uruchomienia skryptu Python Measure-Command {start-process \Python27\python test.py -Wait}. Spowoduje to otwarcie nowego okna cmd w celu uruchomienia procesu, ale następnie zamknie okno po zakończeniu działania. Chciałbym również zobaczyć wynik skryptu, więc jak mogę zachować otwarte okno?
John Peter Thompson Garcés,

2
@ JohnPeterThompsonGarcés użyć -NoNewWindow parametr cmdletu uruchomienie procesu
mjsr

21

Używam Win XP, z jakiegoś powodu timeit.exenie działa dla mnie. Znalazłem inną alternatywę ptime:

ptime 1.0 - Dokładnie mierzy czas wykonywania programu

ptime uruchomi dowolne określone polecenie i parametry oraz zmierzy czas wykonania (czas działania) w sekundach, z dokładnością do 5 milisekund lub więcej. Jest to automatyczny zegar procesowy lub zegar programowy wykorzystywany do celów testowych.


ptime ma jeden mały błąd. ptime zawsze zwraca 0 jako poziom błędu, nawet jeśli program „potomny” kończy działanie z błędem
Yura Shinkarev

Super prosta i dokładna wydajność.
janpio,

Wydaje się, że działa dobrze w Win10.
mivk

18

Możesz oszukać trochę skryptem wsadowym ...

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

Następnie uruchom program jako argument tego skryptu ...

timer myprogram.exe

i dla argumentów ...

zegar „myprogram.exe -sw1 -sw2”

przykładowe dane wyjściowe:

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

umieść skrypt wsadowy gdzieś w zmiennej PATH, np. C:\Windows\System32i nazwij go timer.cmd. Oczywiście istnieje niewielki hit wydajności polegający na rozwidleniu drugiej instancji cmd, chociaż bardzo minimalny.


to pytanie nie zadziała, @echo off echo %time% < nul cmd /c %1 echo %time% < nul

Nie ma% zamknięcia dla parametrów wiersza poleceń, takich jak% 1. Czy o to ci chodziło?
Andrew J. Brehm

2
Dlaczego miałbyś przekierowywać nul na echo ? echonigdy nie czyta danych wejściowych.
Joey,

1
Możesz zmienić cmd /c %1na cmd /c %*, aby zapisać znak cudzysłowu dla argumentów poleceń
stanleyxu2005

3

W timesystemie Windows nie ma bezpośredniego odpowiednika systemu Unix .

University of Georgia ma krótką listę poleceń systemu Windows dla użytkowników systemu Unix

Uważam, że starszy wiersz polecenia systemu Windows i skrypty .bat są raczej ograniczone w porównaniu z powłokami uniksowymi, ale istnieją pewne możliwości zapętlania plików itp. CommandWindows.com ma kilka wskazówek

Możesz zainstalować bashw systemie Windows (np. Instalując CygWin) lub nauczyć się programu Windows Powershell (który, jak zakładam, ma sposób na zrobienie czegoś równoważnego).


2

Dane wyjściowe dla twojego kodu mogą być przesyłane do pliku: java test <inputfile> | Out-File d:\a.txt

Aby zmierzyć, ile czasu zajmuje ci kapsułkowanie go w Measure-Commmand:

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


2

Jeśli spróbujesz użyć programu PowerShell z funkcją Measure-Command, pamiętaj, że mogą wystąpić nieoczekiwane problemy. Moje polecenie zapisuje dane binarne do pliku za pomocą >przekierowania, ale PowerShell dodaje BOM na początku pliku i podział wiersza CRLF po każdym zapisie!


1

Trochę kawy pomogło mi to wymyślić:

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

A jeśli chcesz, aby nic nie wyświetlało, po prostu zamień na out-null:

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

Używasz go w ten sposób:

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:\>


0

Istnieje kilka różnych opcji uzyskania polecenia „czas”. Moje preferencje to po prostu zainstalować Cygwin (która pochodzi z UNIXopodobnych timepolecenia).

Alternatywnie możesz napisać skrypt i dodać go do swojej ścieżki (abyś mógł go wykonać bez określania całej ścieżki).

Jeśli masz dostępną Powershell , wypróbuj ten skrypt (działa podczas wywoływania plików - „.ee” itp.):

$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

Uruchom kod za pomocą (na przykład):

time.ps1 python program.py

Korzystając z usługi Batch , sugeruję jedną z najlepszych odpowiedzi tutaj (na Stackoverflow.com) . Oba muszą zostać wklejone. Pamiętaj, że jeśli używasz rozwiązania paxdiablo , powinieneś go wymienić

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

z

%*

0

gnomon to dobre rozwiązanie, jeśli nie potrzebujesz tylko całkowitego czasu działania polecenia, ale także linii do pomiaru linii:

Narzędzie wiersza polecenia do dołączania informacji o znaczniku czasu do standardowego wyjścia innego polecenia. Przydatny w długotrwałych procesach, w których potrzebujesz historycznego zapisu tego, co trwa tak długo.

Zainstalowany przez uruchomienie npm install -g gnomon, a następnie po prostu użyj go przez command | gnomon.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.