Làm cách nào để đo thời gian thực hiện lệnh trên dòng lệnh Windows?


Câu trả lời:


113

Nếu bạn đang sử dụng Windows 2003 (lưu ý rằng máy chủ windows 2008 trở lên không được hỗ trợ), bạn có thể sử dụng Bộ tài nguyên Windows Server 2003, có chứa timeit.exe hiển thị số liệu thống kê thực hiện chi tiết. Dưới đây là một ví dụ, định thời gian cho lệnh "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

Bạn có thể lấy TimeIt trong Bộ tài nguyên Windows 2003. Tải về ở đây .


7
Bộ này có vấn đề với windows 2008 64bit và không hoạt động trên 2008 R2
Artem

Có cách nào để đo thời gian hạt nhân và / hoặc thời gian được sử dụng bởi các quy trình phụ được sinh ra không?
rogerdpack

38
FYI - Tôi không nghĩ timeit hoạt động trên Windows 7 64-bit. Bạn gặp lỗi "Không thể truy vấn dữ liệu hiệu suất hệ thống (c0000004). Thay vào đó, hãy sử dụng" Lệnh-Đo lường "của PowerShell như Casey.K gợi ý: stackoverflow.com/questions/673523/
Michael La Voie

6
Trong Windows 7 tôi thấy "'timeit' không được nhận dạng như một lệnh bên trong hoặc bên ngoài, chương trình có thể hoạt động hoặc tệp bó."
Đại tá Panic

3
Tôi không thấy lệnh trong Windows 10, tôi cũng không dễ dàng tìm thấy Bộ tài nguyên cho Win 10. Có ai biết cách lấy cái này cho 10 không?
Jay Imerman

469

Ngoài ra, Windows PowerShell có lệnh tích hợp tương tự lệnh "thời gian" của Bash. Nó được gọi là "Biện pháp-Lệnh." Bạn sẽ phải đảm bảo rằng PowerShell được cài đặt trên máy chạy nó.

Ví dụ đầu vào:

Measure-Command {echo hi}

Kết quả ví dụ:

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
Đây là giải pháp tốt nhất cho người dùng Windows 7 vì timeit.exe không xuất hiện để hỗ trợ Windows 7
Michael La Voie

14
Trong trường hợp bạn muốn sử dụng các lệnh dos nội bộ (ví dụ: dir, echo, del, v.v.) đừng quên chèn "cmd / c": Đo-Lệnh {cmd / c dir / sc: \ windows> nul}
LietKynes

7
Nếu bạn đang đo điểm chuẩn .exetrong thư mục hiện tại, hãy sử dụng : Measure-Command { .\your.exe }. PowerShell rõ ràng không chạy mọi thứ từ pwdtrừ khi được nói rõ ràng với.
Cristian Diaconescu

13
Mặc dù vậy, nó vẫn che giấu sự khó khăn.
Zitrax

13
Đây KHÔNG PHẢI LÀ TẤT CẢ một công cụ 'tương tự lệnh thời gian của Bash' . Dù vậy, thật tuyệt khi biết ... nhưng: nó không thực thi và trở về<stdout> kết quả của lệnh được đặt trong dấu ngoặc nhọn!
Kurt Pfeifle

287

Nếu bạn muốn

  1. Để đo thời gian thực hiện xuống hàng trăm giây trong định dạng (hh: mm: ss.ff)
  2. Để không phải tải xuống và cài đặt gói tài nguyên
  3. Để trông giống như một mọt sách DOS khổng lồ (ai không)

Hãy thử sao chép tập lệnh sau vào tệp bó mới (ví dụ: timecmd.bat ):

@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)

Sử dụng

Nếu bạn đặt timecmd.bat trong một thư mục trong đường dẫn của mình, bạn có thể gọi nó từ bất cứ đâu như thế này:

timecmd [your command]

Ví dụ

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

Nếu bạn muốn thực hiện chuyển hướng đầu ra, bạn có thể trích dẫn lệnh như thế này:

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

Điều này sẽ xử lý các lệnh chạy từ trước đến sau nửa đêm, nhưng đầu ra sẽ sai nếu lệnh của bạn chạy trong 24 giờ trở lên.


9
thay thế cmd / c% * bằng % * hoạt động trừ khi lệnh của bạn là một tệp bó khác. Sau đó, bạn phải thực hiện cuộc gọi timecmd khác.bat
Jesse Chisholm

2
@JesseChisholm Trong Windows 8 (và tôi cũng đã đọc trong Windows 7), bạn không cần gọi cho .bat
Brian J

4
Vì một số lý do, điều này chỉ mang lại cho tôi đầu ra trong toàn bộ giây ... mà đối với tôi là vô ích. Ý tôi là tôi chạy timecmd pausevà nó luôn có kết quả trong 1 giây, 2,00 giây, 4,00 giây ... thậm chí 0,00 giây! Windows 7.
Camilo Martin

9
@CamiloMartin và những người khác có điều này (như tôi) - bạn có thể có một miền địa phương, sử dụng COMMA thay vì DOT cho số thập phân. Vì vậy, trong phần kiểm tra này, thay đổi delims=:.thành delims=:.,, và sau đó nó sẽ hoạt động "trên bảng".
Tomasz Gandor

5
Có một lỗi số học nghiêm trọng trong tập lệnh đó: Hãy thử với: set start=10:10:10.10 set end=10:11:10.09Và nó sẽ xuất ra: command took 0:1:-1.99 (59.99s total) Bạn nên đảo ngược thứ tự của 4 dòng so sánh "lss 0", để quá trình thực hiện tiến triển chính xác từ các chữ số giới tính thấp đến cao. Sau đó, đầu ra trở thành: command took 0:0:59.99 (59.99s total)
Jean-François Larvoire

230

Hehe, giải pháp đơn giản nhất có thể là thế này:

echo %time%
YourApp.exe
echo %time%

Điều này hoạt động trên mọi Windows ra khỏi hộp.


Trong trường hợp ứng dụng sử dụng đầu ra giao diện điều khiển, có thể thuận tiện để lưu trữ thời gian bắt đầu trong một biến tạm thời:

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

163
Bạn điên à?! Điều đó liên quan đến việc làm toán, như, trong não của bạn. Đây là lý do tại sao chúng tôi phát minh ra máy tính, vì vậy chúng tôi có thể tránh làm những việc như vậy.
Luke Sampson

1
xuất sắc! Mặc dù, đối với thời gian CPU, nó không thực sự có ích
Elijah Saounkine

10
Thậm chí tốt hơn (nếu ứng dụng của bạn tăng đầu ra cho bảng điều khiển): set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% (Xin lỗi, không thể nhận được dòng mới trong nhận xét)
Jono

1
@LukeSampson, bạn có thể sử dụng setđể làm toán. ;-)Oh chờ đã, đừng bận tâm, bạn đã làm điều đó dưới đây.
Synetech

2
Không, đây là một lựa chọn tồi. Điều này cho bạn biết thời gian đồng hồ treo tường, không phải thời gian CPU. Vì vậy, mặc dù dòng lệnh của bạn có thể chỉ mất 100ms, nhưng nếu có một ứng dụng khác ăn cắp CPU, ứng dụng của bạn có thể mất vài giây (giảm 100 lần hoặc hơn). Trên thực tế, nếu máy của bạn bị đập, bạn thậm chí có thể đợi một phút để ứng dụng 100ms nhỏ của mình chạy. Theo dõi thời gian CPU, không phải thời gian đồng hồ treo tường!
Ryan Shillington

102

Chỉ cần mở rộng một chút câu trả lời từ Casey.K về việc sử dụng Measure-Commandtừ PowerShell :

  1. Bạn có thể gọi PowerShell từ dấu nhắc lệnh tiêu chuẩn, như thế này:

    powershell -Command "Measure-Command {echo hi}"
    
  2. Điều này sẽ ăn đầu ra tiêu chuẩn, nhưng bạn có thể ngăn chặn điều đó bằng cách thêm | Out-Defaultnhư thế này từ PowerShell:

    Measure-Command {echo hi | Out-Default}
    

    Hoặc từ một dấu nhắc lệnh:

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

Tất nhiên, bạn có thể tự do bọc nó trong một tập tin kịch bản *.ps1hoặc *.bat.


1
Điều gì nếu lệnh chúng ta muốn đo có dấu ngoặc kép? Điều này có thể được biến thành một tập lệnh .bat trong trường hợp đó không? Ví dụmeasureTime.bat "c:\program files\some dir\program.exe"
GetFree

53

Lớp lót tôi sử dụng trong Windows Server 2008 R2 là:

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

Miễn là mycommand không yêu cầu báo giá (mà vít có xử lý báo giá của cmd). Điều /v:onnày là cho phép hai giá trị TIME khác nhau được đánh giá độc lập thay vì một lần khi thực hiện lệnh.


Điều này cũng sẽ không làm việc cho lô "thư rác", mà ghi đè lên nhãn lần đầu tiên và ngụ ý rằng bạn thay thế các máy tính làm việc tính toán, như đã nêu trong stackoverflow.com/questions/673523/...
Val

Thông thường, bạn có thể thoát dấu ngoặc kép bằng ^cmd (như ^")
n611x007

2
Nếu bạn lặp lại cmd / v: bật cho lần thứ hai, chúng ta thậm chí có thể có mycommand chứa dấu ngoặc kép. Ví dụ : cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!.
Maarten Pennings

8
Đơn giản hơn : echo %time% & *mycommand* & call echo %^time%. Xem thêm câu trả lời này .
Aacini

Nếu lệnh của bạn xuất quá nhiều, có thể dễ dàng hơn chỉ cần đặt 2 lần lại với nhau:cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
ZHANG Zikai

49

Nếu bạn mở cửa sổ lệnh và gọi các lệnh theo cách thủ công, bạn có thể hiển thị dấu thời gian trên mỗi dấu nhắc, ví dụ:

prompt $d $t $_$P$G

Nó cung cấp cho bạn một cái gì đó như:

23.03.2009 15:45:50,77

C:\>

Nếu bạn có một tập lệnh bó nhỏ thực thi các lệnh của mình, hãy có một dòng trống trước mỗi lệnh, ví dụ:

(dòng trống)

myCommand.exe

(dòng trống tiếp theo)

myCommand2.exe

Bạn có thể tính thời gian thực hiện cho mỗi lệnh bằng thông tin thời gian trong lời nhắc. Điều tốt nhất có lẽ là chuyển đầu ra thành tệp văn bản để phân tích thêm:

MyBatchFile.bat > output.txt

3
Nghĩ rằng tôi sẽ bỏ qua vài năm sau cuộc thảo luận để cảm ơn bạn vì đã chia sẻ lệnh nhanh chóng. Tôi đã nhìn thấy rất nhiều mánh khóe của CMD (nhiều hơn một anh chàng bash), nhưng cái này đã thoát khỏi thông báo của tôi.
Steve Howard

Đơn giản, thanh lịch, không cần cài đặt và không viết một tệp bó cho lệnh một lần bắn và có thể thời gian mỗi bước trong một tệp bó.
Matt

26

Vì những người khác đang khuyên bạn nên cài đặt những thứ như phần mềm miễn phí và PowerShell, bạn cũng có thể cài đặt Cygwin , thứ sẽ cho phép bạn truy cập vào nhiều lệnh Unix cơ bản như thời gian :

abe@abe-PC:~$ time sleep 5

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

Không chắc chắn bao nhiêu chi phí Cygwin thêm.


41
Khi trả lời các câu hỏi của Windows, Cygwin bị coi là gian lận :-)
mivk

14
Ông đã quy định rằng ResourceKit, TimeMem, ptime.exe, PowerShell và các tiện ích khác mà người dùng bắt đầu gian lận trước tiên. Do đó, tác giả đã làm cho nhận xét của bạn không phù hợp trước khi bạn viết nó.
Val

Tôi cũng đã nâng cấp điều này vì tôi thấy đây là giải pháp đơn giản nhất vì chương trình miễn phí Cmder bao gồm bash! cmder.net Chỉ cần nhớ rằng nếu bạn cần thoát khoảng trắng trong bash, hãy sử dụng dấu gạch chéo \ ngay trước dấu cách, thay vì "dấu ngoặc kép". ví dụ: cd / c / Chương trình \ Files /
lukescammell

24

Không hoàn toàn thanh lịch như một số chức năng trên Unix, nhưng tạo một tệp cmd trông giống như:

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

Điều đó sẽ hiển thị thời gian bắt đầu và dừng như vậy:

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
Giả sử bạn không cần tính di động trên các ngôn ngữ khác nhau, bạn cũng có thể đặt một "hiện tại" hoặc một cái gì đó tương tự sau "thời gian <nul" (bằng cách sử dụng tốt của nul bằng cách này, tôi đã luôn sử dụng tiếng vang. Trông không được thanh lịch :)). Và sử dụng "cho" để chỉ trích xuất thời gian, không phải văn bản.
Joey

2
Nếu tiện ích mở rộng lệnh được bật (nghĩa là mặc định), phiên bản Win XP time/ttùy chọn chỉ hiển thị thời gian hệ thống hiện tại mà không nhắc bạn nhập thời gian mới. Tuy nhiên, khi bạn làm điều đó, nó chỉ hiển thị giờ và phút, có thể không đủ tốt cho một số cách sử dụng. (Xem câu trả lời của John Snow cho câu hỏi này.)
martineau

3
time /Tchỉ có thể sử dụng được nếu quá trình chạy trong vài phút! time < nullà xấu hơn nhưng chính xác hơn.
PhiLho

6
Bạn cũng có thể sử dụng echo %time%cung cấp định dạng và độ chính xác tương tự time < nul, nhưng bạn tránh Enter the new time:đầu ra ...
aschipfl

để sử dụng amd độc lập với thời gian chính xác hơnwmic os get LocalDateTime
phuclv

19

Tôi sử dụng phần mềm miễn phí có tên là "GS Timer".

Chỉ cần tạo một tệp bó như thế này:

timer
yourapp.exe
timer /s

Nếu bạn cần một tập hợp thời gian, chỉ cần chuyển đầu ra của bộ định thời / s thành tệp .txt.

Bạn có thể lấy nó ở đây: Tiện ích DOS miễn phí của Gammadyne


Độ phân giải là 0,1 giây.


4
Tôi không nghĩ việc sử dụng ứng dụng của bên thứ ba có thể được coi là thực hiện "với phương tiện tiêu chuẩn".
martineau

4
Người hỏi có nghĩa là "không cần cài đặt phần mềm bổ sung", nhưng sau đó câu trả lời (được chấp nhận) hàng đầu cũng yêu cầu cài đặt toàn bộ Windows 2003 Resource Kit! Dù sao, timer.exe là hoàn hảo cho những gì tôi đang tìm kiếm, cảm ơn!
Hugo

1
Đây là một liên kết trồng. SoftPedia là một trang trại nhấp chuột.
Tom A

@Tom hãy giải thích, ý bạn là "liên kết trồng cây" là gì?
pepoluan

10
Đây là một liên kết trực tiếp đến trang riêng của nhà phát triển: gammadyne.com/cmdline.htmlm#timer
Hugo

14

Tôi đang sử dụng Windows XP và vì một số lý do, timeit.exe không hoạt động với tôi. Tôi tìm thấy một sự thay thế khác - PTIME. Điều này hoạt động rất tốt.

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

Thí dụ -

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

Hoạt động tốt trên Windows 8.1. Tôi đã đổi tên của tôi thành timer.exe, vì tôi không bao giờ có thể nhớ tên ptime.
Brian Burns

11

Ngoài ra còn có TimeMem (tháng 3 năm 2012):

Đây là một tiện ích Windows thực thi chương trình và hiển thị thời gian thực hiện, sử dụng bộ nhớ và thống kê IO. Nó tương tự về chức năng với tiện ích thời gian Unix.


10

Miễn là nó không kéo dài hơn 24 giờ ...

@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
Thật ấn tượng, nhưng tôi không nghĩ nó hoạt động nếu có 08 hoặc 09 trong thời gian bắt đầu hoặc kết thúc bởi vì những điều này được hiểu là quãng tám. Câu trả lời của tôi xử lý điều đó :)
Luke Sampson

6

Đây là

Phiên bản hẹn giờ Postfix:

Ví dụ sử dụng:

thời gian chờ 1 | TimeIt.cmd

Execution took  ~969 milliseconds.

Sao chép và dán phần này vào một số trình soạn thảo như ví dụ Notepad ++ và lưu nó dưới dạng 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

^ - Dựa trên phiên bản 'Daniel Sparks'


5

Một cách khác để đo thời gian chỉ đơn giản là "Nhận ngày". Bạn không gặp rắc rối với đầu ra chuyển tiếp, v.v.

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

Đầu ra:

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

Điều này thật hoàn hảo đối với tôi
Brett Rowberry

4

Đây là một lớp lót tránh sự mở rộng bị trì hoãn , có thể làm phiền một số lệnh nhất định:

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

Đầu ra giống như:

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

Đối với các bài kiểm tra dài hạn thay thế $Tbởi $D, $T%TIME%bởi%DATE%, %TIME% để bao gồm ngày tháng.

Để sử dụng bên trong tệp bó , thay thế %Zbằng %%Z.


Cập nhật

Đây là một lớp lót được cải tiến (không bị trì hoãn mở rộng ):

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

Đầu ra trông tương tự như thế này:

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

Cách tiếp cận này không bao gồm quá trình tạo ra một cmdkết quả mới trong kết quả, và cũng không bao gồm prompt(các) lệnh.


4

Tùy thuộc vào phiên bản Windows bạn đang sử dụng, chỉ cần chạy bashsẽ đưa bạn vào chế độ Bash. Điều này sẽ cho phép bạn sử dụng một loạt các lệnh không có sẵn trên PowerShell trực tiếp (như timelệnh). Thời gian lệnh của bạn bây giờ dễ dàng như thực thi:

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

Lưu ý: Bạn có thể dễ dàng thoát khỏi chế độ Bash và quay trở lại vỏ chính của mình bằng cách chạy exittrong khi ở chế độ Bash.

Điều này làm việc cho tôi một cách hoàn hảo (Windows 10) sau khi thử các phương pháp khác (như Measure-Command) đôi khi tạo ra các số liệu thống kê không mong muốn. Hy vọng điều này làm việc cho bạn là tốt.


2
Kể từ Windows 10 1607, câu trả lời tốt nhất.
CarpeDiemKopi

2

Trong trường hợp bất kỳ ai khác đến đây để tìm câu trả lời cho câu hỏi này, có một hàm API Windows được gọi GetProcessTimes(). Có vẻ như không có quá nhiều công việc để viết một chương trình C nhỏ sẽ bắt đầu lệnh, thực hiện cuộc gọi này và trả về thời gian xử lý.


3
Có vẻ như quá nhiều công việc để tải xuống một chương trình C nhỏ sẽ bắt đầu lệnh, thực hiện cuộc gọi này (và các phép đo nâng cao hơn nhiều) và trả về thời gian xử lý.
Elazar Leibovich

@ElazarLeibovich powershell? Bạn có thể gọi nó từ C #.
KeyWeeUsr

@KeyWeeUsr bạn có thể sử dụng Windows API IIRC từ các blog PS.technet.microsoft.com/heyscriptingguy/2013/06/25/ trên
Elazar Leibovich

2

Đây là một nhận xét / chỉnh sửa cho Luke Sampson rất hay timecmd.batvà trả lời

Vì một số lý do, điều này chỉ mang lại cho tôi đầu ra trong toàn bộ giây ... mà đối với tôi là vô ích. Ý tôi là tôi chạy tạm dừng timecmd và nó luôn có kết quả trong 1 giây, 2,00 giây, 4,00 giây ... thậm chí 0,00 giây! Windows 7. - Camilo Martin ngày 25 tháng 9 năm 13 lúc 16:00 "

Trên một số cấu hình, các dấu phân cách có thể khác nhau. Những thay đổi sau đây sẽ bao gồm ít nhất là hầu hết các nước phương tây.

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

Các %time% phần nghìn giây hoạt động trên hệ thống của tôi sau khi thêm ','

(* vì trang web không cho phép nhận xét anon và không theo dõi danh tính tốt mặc dù tôi luôn sử dụng cùng một email khách kết hợp với ipv6 ip và dấu vân tay của trình duyệt nên đủ để nhận dạng duy nhất mà không cần mật khẩu)


Tôi chỉ nhận xét rằng trước khi cuộn xuống câu trả lời của bạn. Dù sao, kịch bản của Luke có thể không có giờ, phút và giây, không chỉ là giây phụ (là phần trăm giây và không phải là mili giây, BTW). Xem ở đây: en.wiktionary.org/wiki/centisecond
Tomasz Gandor

2

Đây là phương pháp của tôi, không chuyển đổi và không ms. Rất hữu ích để xác định thời lượng mã hóa (giới hạn trong 24 giờ):

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

Không hoạt động. Bắt: ngoặc đơn không cân bằng. Dấu ngoặc không cân bằng. Thiếu toán hạng.
Richard Sandoz

@RichardSandoz Nó hoạt động tốt, không có dấu ngoặc đơn không cân bằng. Bạn sử dụng nó như thế nào?
MikeM

1

Tập lệnh sau chỉ sử dụng "cmd.exe" và xuất ra số mili giây từ khi đường ống được tạo cho đến khi quá trình trước tập lệnh thoát ra. tức là, nhập lệnh của bạn và chuyển lệnh thành tập lệnh. Ví dụ: "thời gian chờ 3 | runtime.cmd" sẽ mang lại kết quả như "2990." Nếu bạn cần cả đầu ra thời gian chạy và đầu ra stdin, hãy chuyển hướng stdin trước ống dẫn - ví dụ: "dir / s 1> temp.txt | runtime.cmd" sẽ chuyển đầu ra của lệnh "dir" sang "temp.txt" và sẽ in thời gian chạy đến bàn điều khiển.

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

Thay vì gọi đệ quy kịch bản, hãy xem xét thực hiện như thế này call :calc. Tôi đã làm điều đó ở đây. Mã liên kết nhận được một số những gì đẹp hơn theo cách này. : D
Nadu

Lỗi # 1 sẽ thất bại vào giờ thứ 12. Ví dụ: " 0 : 23: 19,42" Lỗi # 2 sẽ thất bại nếu dấu thập phân là bất cứ điều gì khác hơn. cùng một ví dụ: "0:23:19 , 42" ở đây điểm thập phân là, <__________> Cũng đã cố gắng chỉnh sửa tuy nhiên câm lặng **** trong 'ủy ban phê duyệt chỉnh sửa' đã từ chối - 3 trong số 5 bình chọn "Chỉnh sửa này cũng thay đổi phần lớn các tác giả có ý định ban đầu. " vì vậy nếu cảm thấy muốn thử chỉnh sửa vận may của mình hoặc chỉ giữ các lỗi trong - vì vậy 'ý định ban đầu của tác giả vẫn còn nguyên'. facepalm
Nadu

Không thể xuất ra mili giây khi độ phân giải của đồng hồ của bạn hầu như không có khả năng phân giải 1/100 giây.
jwdonahue

1

Câu trả lời của driblio có thể được thực hiện ngắn hơn một chút (mặc dù không thể đọc được nhiều)

@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

Theo nhận xét của Luke Sampson phiên bản này là an toàn bát phân, mặc dù nhiệm vụ phải hoàn thành trong 24 giờ.


Không hoạt động. Toán tử thiếu khi một giờ chữ số.
Richard Sandoz

set _time=%time: =0%khắc phục sự cố giờ một chữ số - thay thế ở cả hai nơi.
Laur

1
  1. Trong thư mục chứa chương trình của bạn, nhập notepad mytimer.bat, nhấp vào 'có' để tạo tệp mới.

  2. Dán mã bên dưới, thay thế YourApp.exebằng chương trình của bạn, sau đó lưu lại.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. mytimer.batvào dòng lệnh sau đó nhấn Enter.


7
thời gian / t chỉ cung cấp cho bạn thời gian trong HH: MM. Để thời gian thực thi, bạn thường cần độ chính xác cao hơn ... Đó có phải là bất cứ điều gì bạn có thể thiết lập để đi xuống phân số của một giây không? Tôi đã thử nghiệm tính năng tổng hợp từ JohnW (thời gian <nul) và điều đó thực sự khiến thời gian giảm xuống còn 1/100 giây: HH: MM: SS.XX
awe

1

mã của tôi cung cấp cho bạn thời gian chạy tính bằng mili giây, tối đa 24 giờ, nó không nhạy cảm cục bộ và chiếm các giá trị âm nếu mã chạy suốt nửa đêm. nó sử dụng mở rộng bị trì hoãn và nên được lưu trong tệp cmd / bat.

trước mã của bạn:

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%

sau mã của bạn:

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

nếu bạn muốn thời gian chạy ở định dạng HH: mm: ss.000, hãy thêm:

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

biến t2giữ thời gian chạy của bạn, bạn có thể echo %t2%hiển thị nó.


1

Có Perl cài đặt giải pháp thuê có sẵn, chạy:

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

STDERR đến trước giây được đo

#!/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

Sử dụng một phụ để trả lại thời gian trong một phần trăm giây

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

TIMER "Lean and mean" với định dạng khu vực, 24h và hỗ trợ đầu vào hỗn hợp
Thích ứng với Aacini phương pháp thay thế cơ thể, không có NẾU, chỉ một CHO (sửa chữa khu vực của tôi)

1: Tập tin timer.bat được đặt ở đâu đó trong% PATH% hoặc thư mục hiện tại

@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

Cách sử dụng:
timer & vang start_cmds & timeout / t 3 & vang end_cmds & timer
hẹn giờ & hẹn giờ "23: 23: 23,00"
hẹn giờ "23: 23: 23,00" & timer
hẹn giờ "13.23.23,00" & timer "03: 03: 03.00"
hẹn giờ & hẹn giờ "0: 00: 00.00" không & cmd / v: on / c echo cho đến nửa đêm =! Timer_end!
Đầu vào bây giờ có thể được trộn lẫn, đối với những trường hợp không thể, nhưng có thể thay đổi định dạng thời gian trong khi thực hiện

2: Chức năng : bộ đếm thời gian đi kèm với tập lệnh bó (sử dụng mẫu bên dưới):

@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

:: để kiểm tra nó, sao chép-dán cả phần mã trên và dưới

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 và CS, DS là viết tắt của dấu hai chấm, đầu chấm và dấu hai chấm, bộ dấu chấm - được sử dụng để hỗ trợ định dạng hỗn hợp


0

Kịch bản sau đây mô phỏng thời gian * nix epoch, nhưng nó là cục bộ và khu vực. Nó sẽ xử lý các trường hợp cạnh lịch bao gồm cả năm nhuận. Nếu Cygwin có sẵn, các giá trị epoch có thể được so sánh bằng cách chỉ định tùy chọn Cygwin .

Tôi đang ở EST và sự khác biệt được báo cáo là 4 giờ tương đối chính xác. Có một số giải pháp thú vị để loại bỏ TZ và phụ thuộc khu vực, nhưng không có gì tầm thường mà tôi nhận thấy.

@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

Tò mò về downvote. Cảm ơn.
bvj

0

Một giải pháp sử dụng PHP thuần cho cmd và một env. Biến đổi:

@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');"
  • không cần cygwin hoặc các tiện ích không đáng tin cậy. Hữu ích khi PHP có sẵn tại địa phương

  • độ chính xác và định dạng đầu ra có thể dễ dàng điều chỉnh

  • ý tưởng tương tự có thể được chuyển cho PowerShell

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.