Apakah ada cara untuk mengukur waktu eksekusi suatu perintah pada baris perintah Windows?
Apakah ada cara untuk mengukur waktu eksekusi suatu perintah pada baris perintah Windows?
Jawaban:
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 .
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
.exe
di direktori saat ini, gunakan ini: Measure-Command { .\your.exe }
. PowerShell tampaknya tidak menjalankan apa pun pwd
kecuali diminta secara eksplisit.
<stdout>
hasil perintah yang terlampir dalam kurung keriting!
jika kamu mau
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.
timecmd pause
, saya berlari , dan selalu menghasilkan 1,00 detik, 2,00 detik, 4,00 detik ... bahkan 0,00 detik! Windows 7.
delims=:.
menjadi delims=:.,
, dan kemudian harus berfungsi "di seluruh papan".
set start=10:10:10.10
set end=10:11:10.09
Dan 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)
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%
set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time%
(Maaf, tidak bisa mendapatkan baris baru di komentar)
set
untuk melakukan perhitungan. ;-)
Oh, tunggu, tidak apa-apa, Anda sudah melakukannya di bawah.
Hanya sedikit perluasan jawaban dari Casey.K tentang penggunaan Measure-Command
dari PowerShell :
Anda dapat memanggil PowerShell dari prompt perintah standar, seperti ini:
powershell -Command "Measure-Command {echo hi}"
Ini akan memakan output standar, tetapi Anda dapat mencegahnya dengan menambahkan | Out-Default
seperti 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 *.ps1
atau *.bat
.
measureTime.bat "c:\program files\some dir\program.exe"
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:on
adalah untuk memungkinkan untuk dua nilai WAKTU yang berbeda untuk dievaluasi secara independen dan bukan sekali pada pelaksanaan perintah.
^
di dalam cmd (seperti ^"
)
cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!
.
echo %time% & *mycommand* & call echo %^time%
. Lihat juga jawaban ini .
cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
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
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.
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:
time
memiliki /t
opsi 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.)
time /T
hanya dapat digunakan jika proses berjalan selama beberapa menit! time < nul
lebih jelek tapi lebih tepat.
echo %time%
format dan ketepatan yang sama dengan yang Anda gunakan time < nul
, tetapi Anda menghindari Enter the new time:
hasilnya ...
wmic os get LocalDateTime
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.
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 <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
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.
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.
Ini dia
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'
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
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 $T
dengan $D, $T
dan %TIME%
dengan %DATE%, %TIME%
memasukkan tanggal.
Untuk menggunakan ini di dalam file batch , ganti %Z
dengan %%Z
.
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 cmd
dalam hasilnya, juga tidak termasuk prompt
perintah.
Bergantung pada versi Windows yang Anda gunakan, hanya menjalankan bash
akan menempatkan Anda dalam mode Bash. Ini akan memungkinkan Anda untuk menggunakan banyak perintah yang tidak tersedia di PowerShell secara langsung (seperti time
perintah). 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
exit
saat 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.
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.
Ini adalah komentar / edit untuk timecmd.bat
balasan 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)
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
@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.
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
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.
set _time=%time: =0%
memperbaiki masalah satu digit jam - ganti di kedua tempat.
Di direktori tempat program Anda, ketik notepad mytimer.bat
, klik 'ya' untuk membuat file baru.
Rekatkan kode di bawah ini, ganti YourApp.exe
dengan program Anda, lalu simpan.
@echo off
date /t
time /t
YourApp.exe
date /t
time /t
Ketikkan mytimer.bat
baris perintah lalu tekan Enter.
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 t2
menahan waktu berjalan Anda, Anda bisa echo %t2%
menampilkannya.
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;
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
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
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
@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(' ', '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