Bagaimana cara mengukur waktu eksekusi suatu perintah pada baris perintah Windows?

Jawaban:

113

Jika Anda menggunakan Windows 2003 (perhatikan bahwa windows server 2008 dan yang lebih baru tidak didukung), Anda dapat menggunakan Windows Server 2003 Resource Kit, yang berisi timeit.exe yang menampilkan statistik eksekusi terperinci. Berikut ini contohnya, mengatur waktu perintah "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

Anda bisa mendapatkan TimeIt di Windows 2003 Resource Kit. Unduh di sini .

Melayani
sumber
7
Kit ini memiliki masalah dengan windows 2008 64bit dan tidak berfungsi pada 2008 R2
Artem
apakah ada cara untuk mengukur waktu kernel dan / atau waktu yang digunakan oleh sub proses yang muncul?
rogerdpack
38
FYI - Saya tidak berpikir timeit bekerja di Windows 7 64-bit. Anda mendapatkan kesalahan "Tidak dapat meminta data kinerja sistem (c0000004). Alih-alih, gunakan PowerShell" Measure-Command "seperti Casey.K menyarankan: stackoverflow.com/questions/673523/…
Michael La Voie
6
Di Windows 7 saya melihat "'timeit' tidak dikenali sebagai perintah internal atau eksternal, program yang dapat dijalankan atau file batch."
Kolonel Panic
3
Saya tidak melihat perintah di Windows 10, saya juga tidak dengan mudah menemukan Resource Kit untuk Win 10. Apakah ada yang tahu cara mendapatkan ini untuk 10?
Jay Imerman
469

Atau, Windows PowerShell memiliki perintah bawaan yang mirip dengan perintah "waktu" Bash. Ini disebut "Measure-Command." Anda harus memastikan bahwa PowerShell diinstal pada mesin yang menjalankannya.

Input Contoh:

Measure-Command {echo hi}

Contoh Output:

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
Casey.K
sumber
21
Ini adalah solusi terbaik untuk pengguna Windows 7 karena timeit.exe tampaknya tidak mendukung Windows 7
Michael La Voie
14
Jika Anda ingin menggunakan perintah dos internal (mis .: dir, echo, del, dll.) Jangan lupa untuk memasukkan "cmd / c": Measure-Command {cmd / c dir / sc: \ windows> nul}
LietKynes
7
Jika Anda pembandingan sebuah .exedi direktori saat ini, gunakan ini: Measure-Command { .\your.exe }. PowerShell tampaknya tidak menjalankan apa pun pwdkecuali diminta secara eksplisit.
Cristian Diaconescu
13
Anehnya itu menyembunyikan stdout sekalipun.
Zitrax
13
Ini BUKANLAH SEMUA alat 'mirip dengan perintah waktu Bash' . Senang mengetahui ... tapi: itu tidak mengeksekusi dan kembali ke<stdout> hasil perintah yang terlampir dalam kurung keriting!
Kurt Pfeifle
287

jika kamu mau

  1. Untuk mengukur waktu eksekusi hingga seperseratus detik dalam (jj: mm: dst. Fs)
  2. Untuk tidak harus mengunduh dan menginstal paket sumber daya
  3. Terlihat seperti kutu buku DOS besar (yang tidak)

Coba salin skrip berikut ke file batch baru (mis. 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)

Pemakaian

Jika Anda meletakkan timecmd.bat di direktori di jalur Anda, Anda dapat memanggilnya dari mana saja seperti ini:

timecmd [your command]

Misalnya

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

Jika Anda ingin melakukan redirection output, Anda dapat mengutip perintah seperti ini:

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

Ini harus menangani perintah yang berjalan dari sebelum ke setelah tengah malam, tetapi hasilnya akan salah jika perintah Anda berjalan selama 24 jam atau lebih.

Luke Sampson
sumber
9
mengganti cmd / c% * dengan % * berfungsi kecuali perintah Anda adalah file batch lain. Maka Anda harus melakukan panggilan timecmd other.bat
Jesse Chisholm
2
@JesseChisholm Di Windows 8 (dan saya sudah membaca di Windows 7 juga) Anda tidak perlu panggilan untuk .bat
Brian J
4
Untuk beberapa alasan ini hanya memberi saya output dalam seluruh detik ... yang bagi saya tidak berguna. Maksud saya timecmd pause, saya berlari , dan selalu menghasilkan 1,00 detik, 2,00 detik, 4,00 detik ... bahkan 0,00 detik! Windows 7.
Camilo Martin
9
@CamiloMartin & orang lain yang memiliki ini (seperti saya) - Anda mungkin memiliki lokal, yang menggunakan COMMA alih-alih DOT untuk desimal. Jadi, dalam skrip ini, ubah delims=:.menjadi delims=:.,, dan kemudian harus berfungsi "di seluruh papan".
Tomasz Gandor
5
Ada kesalahan aritmatika yang serius dalam skrip itu: Cobalah dengan: set start=10:10:10.10 set end=10:11:10.09Dan hasilnya: command took 0:1:-1.99 (59.99s total) Anda harus membalik urutan 4 baris yang melakukan perbandingan "lss 0", sehingga carry berkembang dengan benar dari angka sexagesimal rendah ke tinggi. Kemudian hasilnya menjadi: command took 0:0:59.99 (59.99s total)
Jean-François Larvoire
230

Hehe, solusi paling sederhana mungkin adalah ini:

echo %time%
YourApp.exe
echo %time%

Ini berfungsi pada setiap Windows di luar kotak.


Dalam kasus aplikasi yang menggunakan output konsol, mungkin lebih nyaman untuk menyimpan waktu mulai dalam variabel sementara:

set startTime=%time%
YourApp.exe
echo Start Time: %startTime%
echo Finish Time: %time%
LietKynes
sumber
163
Kamu gila?! Itu melibatkan melakukan matematika, seperti, di otak Anda. Inilah sebabnya kami menemukan komputer, sehingga kami dapat menghindari melakukan hal-hal seperti itu.
Luke Sampson
1
cemerlang! Meskipun demikian, untuk waktu CPU tidak terlalu membantu
Elijah Saounkine
10
Bahkan lebih baik (jika aplikasi Anda meludahkan output ke konsol): set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% (Maaf, tidak bisa mendapatkan baris baru di komentar)
Jono
1
@ LukasSson, Anda dapat menggunakan setuntuk melakukan perhitungan. ;-)Oh, tunggu, tidak apa-apa, Anda sudah melakukannya di bawah.
Synetech
2
Tidak, ini pilihan yang buruk. Ini memberitahu Anda waktu jam dinding, bukan waktu CPU. Jadi, meskipun baris perintah Anda mungkin hanya membutuhkan 100 ms, jika ada aplikasi lain yang memonopoli CPU, aplikasi Anda mungkin memerlukan waktu beberapa detik (dinonaktifkan oleh 100x atau lebih). Bahkan, jika mesin Anda meronta-ronta, Anda bahkan bisa menunggu sebentar untuk menjalankan aplikasi 100 ms kecil Anda. Lacak waktu CPU, bukan waktu jam dinding!
Ryan Shillington
102

Hanya sedikit perluasan jawaban dari Casey.K tentang penggunaan Measure-Commanddari PowerShell :

  1. Anda dapat memanggil PowerShell dari prompt perintah standar, seperti ini:

    powershell -Command "Measure-Command {echo hi}"
    
  2. Ini akan memakan output standar, tetapi Anda dapat mencegahnya dengan menambahkan | Out-Defaultseperti ini dari PowerShell:

    Measure-Command {echo hi | Out-Default}
    

    Atau dari prompt perintah:

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

Tentu saja, Anda bebas untuk membungkus ini dalam file skrip *.ps1atau *.bat.

Vladimir Veljkovic
sumber
1
Bagaimana jika perintah yang ingin kita ukur memiliki tanda kutip? Bisakah ini diubah menjadi skrip .bat dalam kasus itu? MisalnyameasureTime.bat "c:\program files\some dir\program.exe"
GetFree
53

Satu-liner yang saya gunakan di Windows Server 2008 R2 adalah:

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

Selama perintah saya tidak memerlukan tanda kutip (yang mengacaukan pemrosesan penawaran cmd). The /v:onadalah untuk memungkinkan untuk dua nilai WAKTU yang berbeda untuk dievaluasi secara independen dan bukan sekali pada pelaksanaan perintah.

Nathan Herring
sumber
Ini juga tidak akan berfungsi untuk kumpulan "spam", yang menimpa label pertama kali dan menyiratkan bahwa Anda mengganti komputer yang melakukan perhitungan, seperti yang tercantum di stackoverflow.com/questions/673523/…
Val
Biasanya Anda dapat menghindari tanda kutip ^di dalam cmd (seperti ^")
n611x007
2
Jika Anda mengulangi cmd / v: on untuk timing kedua, kami bahkan dapat meminta perintah saya berisi tanda kutip. Contoh: cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!.
Maarten Pennings
8
Sederhana: echo %time% & *mycommand* & call echo %^time%. Lihat juga jawaban ini .
Aacini
Jika perintah Anda menghasilkan terlalu banyak, mungkin lebih mudah buat saja waktu bersama:cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
ZHANG Zikai
49

Jika Anda memiliki jendela perintah terbuka dan memanggil perintah secara manual, Anda dapat menampilkan cap waktu pada setiap prompt, misalnya

prompt $d $t $_$P$G

Ini memberi Anda sesuatu seperti:

23.03.2009 15:45:50,77

C:\>

Jika Anda memiliki skrip batch kecil yang mengeksekusi perintah Anda, miliki baris kosong sebelum setiap perintah, misalnya

(baris kosong)

myCommand.exe

(baris kosong berikutnya)

myCommand2.exe

Anda dapat menghitung waktu eksekusi untuk setiap perintah dengan informasi waktu pada prompt. Mungkin yang terbaik adalah menyalurkan output ke textfile untuk analisis lebih lanjut:

MyBatchFile.bat > output.txt
Treb
sumber
3
Kupikir aku akan turun dalam beberapa tahun di belakang diskusi untuk berterima kasih karena telah berbagi perintah cepat. Saya telah melihat banyak trik CMD (lebih dari seorang bash guy), tetapi yang ini luput dari perhatian saya.
Steve Howard
Sederhana, elegan, tanpa instalasi dan tanpa menulis file batch untuk perintah sekali pakai dan dapat menentukan waktu setiap langkah dalam file batch.
Matt
26

Karena orang lain merekomendasikan untuk menginstal hal-hal seperti freeware dan PowerShell, Anda juga dapat menginstal Cygwin , yang akan memberi Anda akses ke banyak perintah dasar Unix seperti waktu :

abe@abe-PC:~$ time sleep 5

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

Tidak yakin berapa banyak overhead yang ditambahkan Cygwin.

Abe Voelker
sumber
41
Saat menjawab pertanyaan Windows, Cygwin dianggap curang :-)
mivk
14
Dia telah menetapkan bahwa ResourceKit, TimeMem, ptime.exe, PowerShell dan pengguna utilitas lainnya mulai curang terlebih dahulu. Karena itu, penulis membuat komentar Anda tidak pantas sebelum Anda menulisnya.
Val
Saya juga telah memutakhirkan ini karena saya menemukan ini solusi termudah sejak program gratis Cmder menyertakan bash! cmder.net Ingatlah bahwa jika Anda perlu menghindari spasi di bash, gunakan blackslash \ tepat sebelum spasi, alih-alih "tanda kutip". misal, cd / c / Program \ Files /
lukescammell
24

Tidak seanggun beberapa fungsi di Unix, tetapi buat file cmd yang terlihat seperti:

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

Itu akan menampilkan waktu mulai dan berhenti seperti:

The current time is: 10:31:57.92
Enter the new time:
The current time is: 10:32:05.94
Enter the new time:
JohnW
sumber
2
Dengan asumsi Anda tidak membutuhkan portabilitas di berbagai bahasa, Anda juga dapat meletakkan findstr "current" atau sesuatu seperti itu setelah "time <nul" (omong-omong, penggunaan nul yang bagus; saya selalu menggunakan echo. | Time, tetapi itu tidak terlihat elegan :)). Dan gunakan "untuk" untuk mengekstrak hanya waktu, bukan teks.
Joey
2
Jika ekstensi perintah diaktifkan (yaitu, default), versi Win XP dari timememiliki /topsi yang hanya menampilkan waktu sistem saat ini, tanpa mendorong Anda untuk memasukkan waktu baru. Namun ketika Anda melakukannya hanya menampilkan jam dan menit, yang mungkin tidak cukup baik untuk beberapa penggunaan. (Lihat jawaban John Snow untuk pertanyaan ini.)
martineau
3
time /Thanya dapat digunakan jika proses berjalan selama beberapa menit! time < nullebih jelek tapi lebih tepat.
PhiLho
6
Anda juga dapat menggunakan echo %time%format dan ketepatan yang sama dengan yang Anda gunakan time < nul, tetapi Anda menghindari Enter the new time:hasilnya ...
aschipfl
untuk lokal-independen dan penggunaan waktu yang lebih tepatwmic os get LocalDateTime
phuclv
19

Saya menggunakan freeware yang disebut "GS Timer".

Buat saja file batch seperti ini:

timer
yourapp.exe
timer /s

Jika Anda membutuhkan serangkaian waktu, cukup sambungkan output timer ke file .txt.

Anda bisa mendapatkannya di sini: Utilitas DOS Gratis Gammadyne


Resolusi adalah 0,1 detik.

pepoluan
sumber
4
Saya tidak berpikir menggunakan aplikasi pihak ketiga dapat dianggap melakukannya "dengan cara standar".
martineau
4
Penanya berarti "tanpa menginstal perangkat lunak tambahan", tetapi kemudian jawaban teratas (yang diterima) juga mengharuskan menginstal Kit Sumber Daya Windows 2003 secara keseluruhan! Bagaimanapun, timer.exe sempurna untuk apa yang saya cari, terima kasih!
Hugo
1
Ini adalah tautan yang ditanam. SoftPedia adalah layanan klik.
Tom A
@ Tom tolong jelaskan, apa maksud Anda "tautan yang ditanam"?
pepoluan
10
Berikut ini tautan langsung ke halaman pengembang sendiri: gammadyne.com/cmdline.htm#timer
Hugo
14

Saya menggunakan Windows XP dan untuk beberapa alasan timeit.exe tidak berfungsi untuk saya. Saya menemukan alternatif lain - PTIME. Ini bekerja dengan sangat baik.

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

Contoh -

C:\> ptime

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

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 <[email protected]>

===  cd ===
C:\

Execution time: 0.015 s
Murali Krishnan
sumber
Bekerja dengan baik pada Windows 8.1 juga. Saya mengganti nama saya menjadi timer.exe, karena saya tidak pernah dapat mengingat nama ptime.
Brian Burns
11

Ada juga TimeMem (Maret 2012):

Ini adalah utilitas Windows yang menjalankan program dan menampilkan waktu eksekusi, penggunaan memori, dan statistik IO. Ini mirip dalam fungsionalitas dengan utilitas waktu Unix.

Martin Moene
sumber
10

Selama itu tidak bertahan lebih dari 24 jam ...

@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.
driblio
sumber
5
Mengesankan, tapi saya pikir itu tidak berfungsi jika ada 08 atau 09 di awal atau akhir zaman karena ini ditafsirkan sebagai oktal. Jawaban saya mengatasinya :)
Luke Sampson
6

Ini dia

Versi pengatur waktu postfix:

Contoh penggunaan:

batas waktu 1 | TimeIt.cmd

Execution took  ~969 milliseconds.

Salin & tempel ini ke beberapa editor seperti misalnya Notepad ++ dan simpan sebagai 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

^ - Berdasarkan Versi 'Daniel Sparks'

Nadu
sumber
5

Alternatif untuk mengukur waktu hanyalah "Dapatkan-Tanggal". Anda tidak memiliki kerumitan dengan meneruskan keluaran dan sebagainya.

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

Keluaran:

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
Rainer
sumber
Ini sempurna bagi saya
Brett Rowberry
4

Ini adalah one-liner yang menghindari ekspansi yang tertunda , yang dapat mengganggu perintah tertentu:

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

Outputnya seperti:

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

Untuk tes jangka panjang, ganti $Tdengan $D, $Tdan %TIME%dengan %DATE%, %TIME%memasukkan tanggal.

Untuk menggunakan ini di dalam file batch , ganti %Zdengan %%Z.


Memperbarui

Ini adalah peningkatan satu-liner (tanpa ekspansi yang tertunda juga):

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

Outputnya mirip dengan ini:

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

Pendekatan ini tidak termasuk proses mengeluarkan yang baru cmddalam hasilnya, juga tidak termasuk promptperintah.

aschipfl
sumber
4

Bergantung pada versi Windows yang Anda gunakan, hanya menjalankan bashakan menempatkan Anda dalam mode Bash. Ini akan memungkinkan Anda untuk menggunakan banyak perintah yang tidak tersedia di PowerShell secara langsung (seperti timeperintah). Pengaturan waktu perintah Anda sekarang semudah mengeksekusi:

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

Catatan: Anda dapat dengan mudah keluar dari mode Bash dan kembali ke shell utama Anda dengan menjalankannya exitsaat dalam mode Bash.

Ini bekerja dengan baik untuk saya (Windows 10) setelah mencoba metode lain (seperti Measure-Command) yang terkadang menghasilkan statistik yang tidak diinginkan. Semoga ini bekerja untuk Anda juga.

Saddam M
sumber
2
Pada Windows 10 1607 jawaban terbaik.
CarpeDiemKopi
2

Jika ada orang lain datang ke sini mencari jawaban untuk pertanyaan ini, ada fungsi Windows API yang disebut GetProcessTimes(). Sepertinya tidak terlalu banyak pekerjaan untuk menulis program C kecil yang akan memulai perintah, melakukan panggilan ini, dan mengembalikan waktu proses.

Jeff Pratt
sumber
3
Sepertinya tidak terlalu banyak pekerjaan untuk mengunduh program C kecil yang akan memulai perintah, melakukan panggilan ini (dan lebih banyak pengukuran sebelumnya), dan mengembalikan waktu proses.
Elazar Leibovich
@ElazarLeibovich PowerShell? Anda dapat memanggilnya dari C #.
KeyWeeUsr
@KeyWeeUsr, Anda dapat menggunakan Windows API IIRC dari PS blogs.technet.microsoft.com/heyscriptingguy/2013/06/25/…
Elazar Leibovich
2

Ini adalah komentar / edit untuk timecmd.batbalasan bagus Luke Sampson

Untuk beberapa alasan ini hanya memberi saya output dalam seluruh detik ... yang bagi saya tidak berguna. Maksud saya, saya menjalankan jeda timecmd, dan selalu menghasilkan 1,00 detik, 2,00 detik, 4,00 detik ... bahkan 0,00 detik! Windows 7. - Camilo Martin 25 Sep 13 'jam 16:00 "

Pada beberapa konfigurasi, pembatas mungkin berbeda. Perubahan berikut harus mencakup setidaknya sebagian besar negara barat.

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

The %time%milidetik bekerja pada sistem saya setelah menambahkan bahwa ''

(* karena situs tidak mengizinkan komentar langsung dan tidak melacak identitas yang baik meskipun saya selalu menggunakan email tamu yang sama yang dikombinasikan dengan ipv6 ip dan sidik jari browser harus cukup untuk mengidentifikasi secara unik tanpa kata sandi)

Pengecut Anonim
sumber
Saya hanya berkomentar sebelum menggulir ke bawah untuk jawaban Anda. Bagaimanapun, skrip Luke dapat mem-pad-kan jam, menit, dan detik, bukan hanya subsekon (yang merupakan centisecond , dan bukan milidetik, BTW). Lihat di sini: en.wiktionary.org/wiki/centisecond
Tomasz Gandor
2

Inilah metode saya, tidak ada konversi dan tidak ada ms. Sangat berguna untuk menentukan jangka waktu pengkodean (terbatas hingga 24 jam):

@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
ilko
sumber
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.
MikeM
sumber
Tidak bekerja. Mendapatkan: kurung tidak seimbang. Tanda kurung tidak seimbang. Operan tidak ada.
Richard Sandoz
@RichardSandoz Berhasil, tidak ada tanda kurung yang tidak seimbang. Bagaimana Anda menggunakannya?
MikeM
1

Script berikut hanya menggunakan "cmd.exe" dan menampilkan jumlah milidetik sejak pipa dibuat hingga saat proses sebelum skrip keluar. yaitu, Ketikkan perintah Anda, dan pipa ke skrip. Contoh: "timeout 3 | runtime.cmd" akan menghasilkan sesuatu seperti "2990." Jika Anda membutuhkan output runtime dan output stdin, arahkan ulang stdin sebelum pipa - ex: "dir / s 1> temp.txt | runtime.cmd" akan membuang output dari perintah "dir" ke "temp.txt" dan akan mencetak runtime ke konsol.

:: --- 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
Daniel Sparks
sumber
Yah alih-alih memanggil skrip secara rekursif , pertimbangkan untuk melakukannya seperti ini call :calc. Saya melakukannya di sini. Kode tautan dapatkan beberapa yang lebih baik dari cara ini. : D
Nadu
Bug # 1 Akan gagal pada jam ke-12. Contoh: " 0 : 23: 19,42" Bug # 2 Akan gagal jika titik desimal adalah hal lain selain. contoh yang sama: "0:23:19 , 42" di sini titik desimal adalah, <__________> Mencoba dengan baik namun bodoh itu **** di 'edit komisi persetujuan' menolaknya - 3 dari 5 memberi suara "Sunting ini juga berubah banyak dari niat asli penulis. " jadi jika Anda ingin mencoba keberuntungan Anda, edit atau simpan saja bug - jadi 'niat asli penulis tetap utuh'. facepalm
Nadu
Tidak dapat menampilkan milidetik ketika resolusi jam Anda hampir tidak mampu dengan resolusi 1/100 detik.
jwdonahue
1

Jawaban driblio bisa dibuat sedikit lebih pendek (meskipun tidak banyak dibaca)

@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

Untuk komentar Luke Sampson versi ini aman untuk oktal, meskipun tugas harus diselesaikan dalam 24 jam.

Alexander
sumber
Tidak bekerja. Operator tidak ada ketika satu digit jam.
Richard Sandoz
set _time=%time: =0%memperbaiki masalah satu digit jam - ganti di kedua tempat.
Laur
1
  1. Di direktori tempat program Anda, ketik notepad mytimer.bat, klik 'ya' untuk membuat file baru.

  2. Rekatkan kode di bawah ini, ganti YourApp.exedengan program Anda, lalu simpan.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. Ketikkan mytimer.batbaris perintah lalu tekan Enter.

Peter Mortensen
sumber
7
waktu / t hanya memberi Anda waktu di HH: MM. Untuk mengatur waktu eksekusi, Anda biasanya perlu lebih akurat ... Apakah ini yang dapat Anda atur untuk turun ke sepersekian detik? Saya menguji solusi dari JohnW (waktu <nul), dan itu benar-benar memberikan waktu ke 1/100-an: HH: MM: SS.XX
awe
1

kode saya memberi Anda waktu berjalan dalam milidetik, hingga 24 jam, tidak sensitif lokal, dan menyumbang nilai negatif jika kode berjalan hingga tengah malam. menggunakan ekspansi tertunda, dan harus disimpan dalam file cmd / bat.

sebelum kode Anda:

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%

setelah kode Anda:

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

jika Anda ingin menjalankan waktu dalam format HH: mm: ss.000, tambahkan:

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

variabel t2menahan waktu berjalan Anda, Anda bisa echo %t2%menampilkannya.

robotik
sumber
1

Setelah Perl menginstal solusi perekrutan yang tersedia, jalankan:

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

STDERR datang sebelum detik yang diukur

#!/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;
Victor Mironov
sumber
0

Menggunakan sub untuk mengembalikan waktu dalam seperseratus detik

::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
Antoni Gual Via
sumber
0

TIMER "Bersandar dan Berarti" dengan format Regional, 24jam dan dukungan input campuran
Mengadaptasi badan metode substitusi Aacini , tanpa IF, hanya satu UNTUK (perbaikan regional saya)

1: File timer.bat ditempatkan di suatu tempat di% PATH% atau direktori saat ini

@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

Penggunaan:
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 hingga tengah malam =! Timer_end!
Input sekarang dapat dicampur, untuk yang tidak mungkin, tetapi perubahan format waktu yang mungkin selama eksekusi

2: Fungsi : timer yang dibundel dengan skrip batch (contoh penggunaan di bawah):

@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

:: untuk mengujinya, salin-tempel bagian kode di atas dan di bawah

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 dan CS, singkatan DS untuk titik akhir, titik akhir dan titik dua, set titik - digunakan untuk dukungan format campuran

AveYo
sumber
0

Script berikut mengemulasi * nix epoch time, tetapi bersifat lokal dan regional. Ini harus menangani kasus tepi kalender termasuk tahun kabisat. Jika Cygwin tersedia, nilai zaman dapat dibandingkan dengan menentukan opsi Cygwin .

Saya di EST dan perbedaannya adalah 4 jam yang relatif benar. Ada beberapa solusi menarik untuk menghapus TZ dan dependensi regional, tetapi tidak ada yang sepele yang saya perhatikan.

@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
bvj
sumber
Ingin tahu tentang downvote. Terima kasih.
bvj
0

Solusi menggunakan PHP murni untuk cmd dan satu env. variabel:

@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');"
  • tidak perlu untuk cygwin atau utilitas yang tidak tepercaya. Berguna ketika PHP tersedia secara lokal

  • format presisi dan keluaran dapat dengan mudah diubah

  • ide yang sama dapat diporting untuk PowerShell

mvorisek
sumber