Windows komut satırında bir komutun yürütme süresini nasıl ölçebilirim?


Yanıtlar:


113

Windows 2003 kullanıyorsanız (Windows Server 2008 ve sonraki sürümlerinin desteklenmediğini unutmayın), ayrıntılı yürütme istatistiklerini gösteren timeit.exe içeren Windows Server 2003 Kaynak Seti'ni kullanabilirsiniz. "Timeit -?" Komutunu zamanlayan bir örnek:

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

TimeIt'i Windows 2003 Kaynak Seti'nde alabilirsiniz. Buradan indirin .


7
Bu kitin Windows 2008 64bit ile ilgili sorunları var ve 2008 R2'de çalışmıyor
Artem

Çekirdek zamanını ve / veya ortaya çıkan alt süreçlerin kullandığı zamanı ölçmenin bir yolu var mı?
rogerdpack

38
Ben timeit Windows 7 64-bit üzerinde çalıştığını sanmıyorum. "Sistem performans verileri sorgulanamadı (c0000004). Bunun yerine, Casey.K'nin önerdiği gibi PowerShell'in" Measure-Command "komutunu kullanın: stackoverflow.com/questions/673523/…
Michael La Voie

6
Windows 7'de "timeit" in dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmadığını görüyorum.
Albay Panik

3
Windows 10'da komutu görmüyorum ya da Win 10 için kolayca bir Kaynak Seti bulmuyorum Herkes 10 için bunu nasıl alabilirim?
Jay Imerman

469

Alternatif olarak, Windows PowerShell, Bash'ın "time" komutuna benzer bir yerleşik komuta sahiptir. Buna "Ölç-Komut" denir. PowerShell'in çalıştıran makineye yüklendiğinden emin olmanız gerekir.

Örnek Giriş:

Measure-Command {echo hi}

Örnek Çıktı:

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
Timeit.exe, Windows 7'yi desteklemediği için Windows 7 kullanıcıları için en iyi çözümdür
Michael La Voie

14
Dahili dos komutlarını kullanmak istiyorsanız (örneğin: dir, echo, del, vb.) "Cmd / c" eklemeyi unutmayın: Measure-Command {cmd / c dir / sc: \ windows> nul}
LietKynes

7
Bir kıyaslama ediyorsanız .exegeçerli dizinde şunu kullanın: Measure-Command { .\your.exe }. Görünüşe göre PowerShell, açıkça belirtilmedikçe hiçbir şeyi çalıştırmaz pwd.
Cristian Diaconescu

13
Rahatsız edici olsa da stdout gizler.
Zitrax

13
Bu TÜM DEĞİL 'Bash'ın zaman komutuna benzer' bir araç değildir . Gerçi bilmek güzel ... ama: Kıvırcık parantez içindeki komutun yürütme ve<stdout> sonuçlarına geri dönmüyor !
Kurt Pfeifle

287

Eğer istersen

  1. Yürütme süresini saniyenin yüzde biri kadar ölçmek için (ss: dd: ss.ff biçimi)
  2. Bir kaynak paketini indirip kurmak zorunda kalmamak için
  3. Büyük bir DOS nerd gibi görünmek (kim değil)

Aşağıdaki komut dosyasını yeni bir toplu iş dosyasına kopyalamayı deneyin (örn. 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)

kullanım

Timecmd.bat dosyasını yolunuzdaki bir dizine koyarsanız, aşağıdaki gibi herhangi bir yerden arayabilirsiniz:

timecmd [your command]

Örneğin

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

Çıktı yeniden yönlendirmesi yapmak istiyorsanız, komutu şu şekilde alıntılayabilirsiniz:

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

Bu, gece yarısından gece yarısına kadar çalışan komutları işlemelidir, ancak komutunuz 24 saat veya daha uzun süre çalışırsa çıkış yanlış olur.


9
yerine cmd / c% * ile *% işleri komut başka toplu iş dosyası olmadığı sürece. O zaman timecmd'yi çağırmalısın other.bat
Jesse Chisholm

2
@JesseChisholm Windows 8'de (ve Windows 7'de de okudum) .bat için çağrıya ihtiyacınız yok
Brian J

4
Nedense bu sadece saniyeler içinde çıktı veriyor ... bu benim için işe yaramaz. Yani koştuğum timecmd pauseve her zaman 1,00 sn, 2,00 sn, 4,00 sn ... hatta 0,00 sn! Windows 7.
Camilo Martin

9
@CamiloMartin ve bunu yapan diğerleri (benim gibi) - ondalık sayı için DOT yerine COMMA kullanan bir yerel ayarınız olabilir. Yani, bu scrpit, değişimde delims=:.için delims=:.,ve daha sonra "yönüyle" çalışması gerekir.
Tomasz Gandor

5
Bu komut dosyasında ciddi bir aritmetik hatası var: set start=10:10:10.10 set end=10:11:10.09Şunu deneyin: Ve çıktı alır: command took 0:1:-1.99 (59.99s total) "lss 0" karşılaştırmaları yapan 4 satırın sırasını tersine çevirmelisiniz. Sonra çıktı: command took 0:0:59.99 (59.99s total)
Jean-François Larvoire

230

Hehe, en basit çözüm şu olabilir:

echo %time%
YourApp.exe
echo %time%

Bu kutudan çıkan her Windows üzerinde çalışır.


Konsol çıktısını kullanan bir uygulamada, başlangıç ​​zamanını geçici bir değişkente saklamak uygun olabilir:

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

163
Sen deli misin?! Bu, beyninizde matematik yapmayı içerir. Bu yüzden bilgisayarları icat ettik, böylece böyle şeyler yapmaktan kaçınabilirdik.
Luke Sampson

1
parlak! Yine de, CPU zamanı için gerçekten yardımcı olmuyor
Elijah Saounkine

10
Daha da iyisi (uygulamanız konsola çıktı verirse): set startTime=%time% \n YourApp.exe \n echo Start Time: %startTime% \n echo Finish Time: %time% (Üzgünüm, yorumda yeni satırlar alınamadı)
Jono

1
@ LukeSampson, setmatematik yapmak için kullanabilirsiniz . ;-)Oh bekle, boşver, bunu zaten aşağıda yaptın.
Synetech

2
Hayır, bu kötü bir seçenek. Bu size CPU saati değil duvar saati süresini bildirir. Bu nedenle, komut satırınız yalnızca 100 ms sürebilir, ancak CPU'yu tutan başka bir uygulama varsa, uygulamanız saniyeler sürebilir (100x veya daha fazla). Aslında, makineniz çökerse, küçük 100ms uygulamanızın çalışması için bir dakika bile bekleyebilirsiniz. CPU saatini takip edin, duvar saati değil!
Ryan Shillington

102

Sadece küçük genişleme Casey.K gelen cevap kullanımı hakkında Measure-Commandgelen PowerShell :

  1. PowerShell'i aşağıdaki gibi standart komut isteminden çağırabilirsiniz:

    powershell -Command "Measure-Command {echo hi}"
    
  2. Bu standart çıktıyı yiyecektir, ancak | Out-DefaultPowerShell'den şu şekilde ekleyerek bunu önleyebilirsiniz :

    Measure-Command {echo hi | Out-Default}
    

    Veya bir komut isteminden:

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

Tabii ki, bunu bir komut dosyasına *.ps1veya dosyasına sarmakta özgürsünüz *.bat.


1
Ölçmek istediğimiz komutta tırnak işaretleri varsa ne olur? Bu, bu durumda bir .bat betiğine dönüştürülebilir mi? ÖrneğinmeasureTime.bat "c:\program files\some dir\program.exe"
GetFree

53

Windows Server 2008 R2'de kullandığım tek astar:

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

Mycommand tırnak gerektirmediği sürece ( cmd'nin tırnak işlemesi olan vidalar). /v:onKomutunun uygulanmasından bir kez yerine, bağımsız bir şekilde değerlendirilmesi için, iki farklı zaman değerleri için sağlamaktır.


Bu aynı zamanda irade ilk kez etiketi üzerine ve belirtildiği gibi, hesaplama yaparak bilgisayar yerine ima "Spam" toplu için değil iş stackoverflow.com/questions/673523/...
Val

Genellikle tarafından tırnak kaçabilir ^cmd (gibi ^")
n611x007

2
İkinci zamanlama için cmd / v: on değerini tekrarlarsanız , mycommand'ın tırnak içermesini bile sağlayabiliriz . Örnek: cmd /v:on /c echo !TIME! & echo "Quoted mycommand" & cmd /v:on /c echo !TIME!.
Maarten Pennings

8
Daha basit: echo %time% & *mycommand* & call echo %^time%. Ayrıca bu cevaba bakınız .
Aacini

Komutunuz çok fazla çıktı veriyorsa, belki de 2 zamanı bir araya getirmek daha kolaydır:cmd /v:on /c "mycommand & echo begin=%time% endtime=!time!"
ZHANG Zikai

49

Bir komut pencereniz açıksa ve komutları manuel olarak çağırıyorsanız, her istemde bir zaman damgası görüntüleyebilirsiniz, örn.

prompt $d $t $_$P$G

Size şöyle bir şey verir:

23.03.2009 15:45:50,77

C:\>

Komutlarınızı yürüten küçük bir toplu komut dosyanız varsa, her komuttan önce boş bir satır kullanın, örn.

(boş satır)

myCommand.exe

(sonraki boş satır)

myCommand2.exe

Her komutun yürütme süresini bilgi istemindeki zaman bilgisiyle hesaplayabilirsiniz. En iyisi, daha fazla analiz için çıktıyı bir metin dosyasına bağlamak olacaktır:

MyBatchFile.bat > output.txt

3
İstemi paylaştığınız için size teşekkür etmek için birkaç yıl içinde tartışmanın arkasına düşeceğimi düşündüm. Bir sürü CMD hilesi gördüm (daha fazla bash adamı), ama bu benim dikkatimden kaçtı.
Steve Howard

Basit, zarif, kurulum yok ve tek çekim komutu için bir toplu iş dosyası yazma ve bir toplu iş dosyasında her adımı zamanlayabilir.
Matt

26

Diğerleri, freeware ve PowerShell gibi şeyleri yüklemeyi önerdiğinden, Cygwin'i de yükleyebilir , bu da size zaman gibi birçok temel Unix komutuna erişmenizi sağlar :

abe@abe-PC:~$ time sleep 5

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

Cygwin'in ne kadar ek yük getirdiğinden emin değilim.


41
Windows sorularını yanıtlarken, Cygwin hile olarak kabul edilir :-)
mivk

14
ResourceKit, TimeMem, ptime.exe, PowerShell ve kullanıcıların önce hile yapmaya başladığını belirtmiştir. Bu nedenle, yazar yorumunuzu yazmadan önce uygunsuz hale getirdi.
Val

Ücretsiz program Cmder bash içerdiğinden en kolay çözümü bulduğum için bunu da iptal ettim! cmder.net Sadece bash içindeki boşluklardan kaçmanız gerekiyorsa, boşluktan hemen önce "tırnak işaretleri" yerine bir karaçam \ kullanın. ör. cd / c / Program \ Files /
lukescammell

24

Unix'teki bazı işlevler kadar zarif değil, ancak aşağıdaki gibi bir cmd dosyası oluşturun:

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

Bu, başlangıç ​​ve bitiş zamanlarını aşağıdaki gibi gösterecektir:

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
Farklı diller arasında taşınabilirliğe ihtiyacınız olmadığını varsayarsak, "time <nul" (bu arada nul'un güzel kullanımı; her zaman echo. | Time,) kullandım. zarif görünmüyor :)). Ve metin için değil, sadece zamanı ayıklamak için "for" kullanın.
Joey

2
Komut uzantıları etkinleştirilirse (varsayılan olarak), Win XP sürümünde yeni bir saat girmenizi istemeden yalnızca geçerli sistem saatini görüntüleyen timebir /tseçenek vardır. Ancak bunu yaptığınızda, yalnızca saatler ve dakikalar görüntülenir; bu, bazı kullanımlar için yeterince iyi olmayabilir. (Bkz. John Snow'un bu soruya cevabı.)
martineau

3
time /Tyalnızca işlem birkaç dakika çalışırsa kullanılabilir! time < nuldaha çirkin ama daha kesindir.
PhiLho

6
Ayrıca kullanabilirsiniz echo %time%aynı biçimi ve hassasiyet sağlayan time < nul, ancak kaçının Enter the new time:... çıkışını
aschipfl

bağımsız bağımsız amd için daha kesin zaman kullanımıwmic os get LocalDateTime
phuclv

19

"GS Timer" adlı ücretsiz yazılım kullanıyorum.

Bunun gibi bir toplu iş dosyası oluşturun:

timer
yourapp.exe
timer /s

Bir dizi zamana ihtiyacınız varsa, zamanlayıcıların çıkışlarını bir .txt dosyasına aktarmanız yeterlidir.

Buradan edinebilirsiniz: Gammadyne Ücretsiz DOS Araçları


Çözünürlük 0,1 saniyedir.


4
Üçüncü taraf bir uygulama kullanmak "standart araçlarla" yapmak düşünülebilir sanmıyorum.
martineau

4
Soru soran, "ek yazılım yüklemeden" anlamına geliyordu, ancak en üstteki (kabul edilen) cevap aynı zamanda bütün bir Windows 2003 Kaynak Seti'nin yüklenmesini gerektiriyor! Neyse, timer.exe sadece ne aradığını mükemmeldi, teşekkürler!
Hugo

1
Bu ekili bir link. SoftPedia bir tıklama çiftliğidir.
Tom A

@ Lütfen açıklayınız, "ekili bağlantı" ne demek?
pepoluan

10
İşte geliştiricinin kendi sayfasına doğrudan bir bağlantı: gammadyne.com/cmdline.htm#timer
Hugo

14

Windows XP kullanıyorum ve bir nedenle timeit.exe benim için çalışmıyor. Başka bir alternatif buldum - PTIME. Bu çok iyi çalışıyor.

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

Misal -

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

Windows 8.1'de de iyi çalışır. Zaman adı adını hatırlayamıyorum, çünkü benim timer.exe için yeniden adlandırdı.
Brian Burns

11

TimeMem de var (Mart 2012):

Bu, bir programı yürüten ve yürütme süresini, bellek kullanımını ve GÇ istatistiklerini görüntüleyen bir Windows yardımcı programıdır. İşlevsel olarak Unix zaman yardımcı programına benzer.


10

24 saatten uzun sürmediği sürece ...

@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
Etkileyici, ancak başlangıç ​​veya bitiş saatlerinde 08 veya 09 varsa işe yaradığını sanmıyorum çünkü bunlar oktal olarak yorumlanıyor. Cevabım bu :)
Luke Sampson

6

Burada bir

Postfix zamanlayıcı sürümü:

Kullanım örneği:

zaman aşımı 1 | TimeIt.cmd

Execution took  ~969 milliseconds.

Bunu kopyalayıp örneğin Notepad ++ gibi bir düzenleyiciye yapıştırın ve TimeIt.cmd olarak kaydedin :

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

^ - 'Daniel Sparks' Versiyonuna göre


5

Ölçüm zamanına bir alternatif, basitçe "Get-Date" dir. Yönlendirme çıkışı vb. İle uğraşmazsınız.

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

Çıktı:

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

Bu benim için mükemmeldi
Brett Rowberry

4

Bu, belirli komutları bozabilecek gecikmeli genişlemeyi önleyen tek astarlıdır:

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

Çıktı şuna benzer:

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

Uzun dönem için testler yerine $Tgöre $D, $Tve %TIME%tarafından %DATE%, %TIME%tarihini içerecek şekilde.

Bir bu içini kullanmak için toplu dosya , yerine %Zgöre %%Z.


Güncelleme

İşte geliştirilmiş bir astar ( gecikmeli genişleme olmadan ):

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

Çıktı buna benzer:

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

Bu yaklaşım cmd, sonuca yeni bir örnek oluşturma sürecini veya promptkomutları içermez .


4

Kullandığınız Windows sürümüne bağlı olarak, sadece koşmak bashsizi Bash moduna geçirir. Bu, doğrudan PowerShell'de bulunmayan bir dizi komutu kullanmanıza izin verir ( timekomut gibi ). Komutunuzu zamanlamak artık yürütmek kadar kolay:

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

Not: Bash modundayken kolayca Bash modundan çıkıp ana kabuğunuza geri dönebilirsiniz exit.

Bu Measure-Command, bazen istenmeyen istatistikler üreten diğer yöntemleri (örneğin ) denedikten sonra benim için mükemmel çalıştı (Windows 10) . Umarım bu sizin için de işe yarar.


2
Windows 10 1607'den itibaren en iyi cevap.
CarpeDiemKopi

2

Başka birinin buraya bu soruya bir cevap araması durumunda, adlı bir Windows API işlevi vardır GetProcessTimes(). Komutu başlatan, bu çağrıyı yapan ve işlem sürelerini döndüren küçük bir C programı yazmak için çok fazla iş gibi görünmüyor.


3
Komutu başlatan, bu çağrıyı yapan (ve çok daha ileri ölçümler) ve işlem sürelerini döndüren küçük bir C programı indirmek için çok fazla iş gibi görünmüyor.
Elazar Leibovich

@ElazarLeibovich powershell? C # ile arayabilirsiniz.
KeyWeeUsr


2

Bu Luke Sampson'ın güzel bir yorum / düzenleme timecmd.batve cevap

Nedense bu sadece saniyeler içinde çıktı veriyor ... bu benim için işe yaramaz. Yani timecmd duraklamasını çalıştırıyorum ve her zaman 1.00 sn, 2.00 sn, 4.00 sn ... hatta 0.00 sn! Windows 7. - Camilo Martin 25 '13 Eylül 16:00 "

Bazı yapılandırmalarda sınırlayıcılar farklı olabilir. Aşağıdaki değişiklik en az batı ülkesini kapsamalıdır.

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

%time%Milisaniye '' olduğunu ekledikten sonra sistemimde çalışır

(* site anon yorumuna izin vermediği ve her zaman ipv6 ip ve tarayıcı parmak izi ile birleştirilmiş aynı konuk e-postasını şifre kullanmadan benzersiz bir şekilde tanımlamak için yeterli olsa bile kimliğinizi iyi takip etmediğinden)


Sadece cevabınıza geçmeden önce bunu yorumladım. Her neyse, Luke'un senaryosu sadece sonraki süreleri değil (milisaniye ve milisaniye değil, BTW) sıfır pad saat, dakika ve saniye olabilir . Buraya bakın: en.wiktionary.org/wiki/centisecond
Tomasz Gandor

2

İşte benim yöntem, dönüşüm ve ms yok. Kodlama sürelerini belirlemek yararlıdır (ancak 24 saatle sınırlıdır):

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

Çalışmıyor. Edinme: Dengesiz parantez. Dengesiz parantez. Eksik işlenen.
Richard Sandoz

@RichardSandoz İyi çalışıyor, dengesiz parantez yok. Nasıl kullanıyorsun?
MikeM

1

Aşağıdaki komut dosyası yalnızca "cmd.exe" kullanır ve bir boru hattı oluşturulduğundan komut dosyasından önceki işlemin çıktığı zamana kadar milisaniye sayısını verir. yani, komutunuzu yazın ve komut dosyasına ekleyin. Örnek: "timeout 3 | runtime.cmd", "2990" gibi bir şey vermelidir. Hem çalışma zamanı çıktısına hem de stdin çıktısına ihtiyacınız varsa, stdin'i borudan önce yönlendirin - örneğin: "dir / s 1> temp.txt | runtime.cmd", "dir" komutunun çıktısını "temp.txt" ye dökür ve çalışma zamanını konsola yazdırır.

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

Senaryoyu özyinelemeli yerine, böyle yapmayı düşünün call :calc. Bunu burada yaptım. link Kodu bu şekilde ne güzel bazı olsun. : D
Nadu

Hata # 1 12. saatte başarısız olacak. Örnek: " 0 : 23: 19,42" Hata # 2 Ondalık noktadan başka bir şey olursa başarısız olur. aynı örnek: "0:23:19 , 42" burada ondalık noktası, <__________> İyi 'düzenleme onay komisyonu' aptal **** reddetti - 3/5 oy "Bu düzenleme de değişir yazarların çoğu orijinal niyet. " öyleyse şans düzenlemenizi deneyin veya sadece hataları saklayın - böylece 'yazarların orijinal amacı sağlam kalır'. facepalm
Nadu

Saatinizin çözünürlüğü 1/100 saniyelik çözünürlüğü zar zor aştığında milisaniye çıkamaz.
jwdonahue

1

Driblio'nun cevabı biraz daha kısa yapılabilir (çok okunabilir olmasa da)

@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

To sözler görev 24 saat içinde tamamlanmalıdır olsa Luke Sampson bu sürümü, sekizli güvenlidir.


Çalışmıyor. Tek haneli saat olduğunda operatör eksik.
Richard Sandoz

set _time=%time: =0%tek haneli saat problemini giderir - her iki yerde değiştirin.
Laur

1
  1. Programınızın bulunduğu dizine, notepad mytimer.batyeni bir dosya oluşturmak için 'evet'i tıklayın.

  2. Aşağıdaki kodu YourApp.exeprogramınızla değiştirin , ardından kaydedin.

    @echo off
    date /t
    time /t
    YourApp.exe
    date /t
    time /t
  3. Tip mytimer.batkomut satırında Enter tuşuna basın.


7
time / t size yalnızca SS: DD cinsinden zaman verir. Yürütülebilir bir dosyayı zamanlamak için genellikle daha fazla doğruluk gerekir ... Saniyenin kesirlerine inmek için ayarlayabileceğiniz bir şey var mı? Ben JohnW (süresi <nul) dan sollution test ve aslında 1 / 100s aşağı zaman verir: SS: DD: SS.XX
korku

1

kodum milisaniye cinsinden çalışma süresini 24 saate kadar verir, yerel ayarlara duyarsızdır ve kod gece yarısı boyunca çalışıyorsa negatif değerleri hesaplar. gecikmeli genişletme kullanır ve bir cmd / bat dosyasına kaydedilmelidir.

kodunuzdan önce:

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%

kodunuzdan sonra:

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

SS: dd: ss.000 formatında çalışma süresi istiyorsanız, şunu ekleyin:

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

değişken t2çalışma sürenizi tutar, echo %t2%görüntülemek için yapabilirsiniz .


1

Perl'in işe alma çözümünü kurmasını sağlayın, çalıştırın:

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

STDERR ölçülen saniyeden önce gelir

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

Saniyenin yüzde biri cinsinden zamanı döndürmek için bir alt öğeyi kullanma

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

Bölgesel biçimi, 24 saat ve karışık giriş desteği ile "Yalın ve Mean" TIMER
Adapte Aacini en ikame yöntemi gövdesini , IF yok, sadece bir FOR (bölgesel düzeltme)

1: Dosya zamanlayıcısı.bat ,% PATH% veya geçerli diz içinde bir yere yerleştirildi

@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

Kullanımı:
zamanlayıcı ve yankı start_cmds ve zaman aşımı / t 3 ve yankı end_cmds ve zamanlayıcı
zamanlayıcı ve zamanlayıcı "23: 23: 23,00"
zamanlayıcı "23: 23: 23,00" ve zamanlayıcı
zamanlayıcı "13.23.23,00" ve zamanlayıcı "03: 03: 03.00"
zamanlayıcı ve zamanlayıcı "0: 00: 00.00" gece yarısına kadar & cmd / v: açık / c yankısı =! Timer_end!
Girdi artık beklenmedik, ancak yürütme sırasında olası zaman biçimi değişiklikleri için karıştırılabilir

2: İşlev : toplu komut dosyası ile birlikte zamanlayıcı (aşağıdaki örnek kullanım):

@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

:: Test etmek için kod bölümlerinin üstüne ve altına kopyalayıp yapıştırın

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 ve CS, DS kolon ucu, nokta ucu ve kolon seti, nokta seti için stand - karışık format desteği için kullanılır


0

Aşağıdaki komut dosyası * nix dönemini öykünür, ancak yerel ve bölgeseldir. Artık yıllar da dahil olmak üzere takvim kenarındaki vakaları ele almalıdır. Cygwin varsa , epoch değerleri Cygwin seçeneği belirtilerek karşılaştırılabilir .

EST'deyim ve bildirilen fark 4 saattir ve bu nispeten doğrudur. TZ ve bölgesel bağımlılıkları ortadan kaldırmak için bazı ilginç çözümler var, ancak fark ettiğim önemsiz bir şey yok.

@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

Downvote hakkında merak ediyorum. Teşekkürler.
bvj

0

Cmd ve bir env için saf PHP kullanan bir çözüm. değişken:

@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');"
  • cygwin veya güvenilmeyen yardımcı programlara gerek yoktur. PHP yerel olarak kullanılabilir olduğunda yararlıdır

  • hassas ve çıktı formatı kolayca ayarlanabilir

  • aynı fikir PowerShell için de taşınabilir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.