How do I measure execution time of a command on the Windows command line?

后端 未结 30 2968
南笙
南笙 2020-11-22 09:44

Is there a built-in way to measure execution time of a command on the Windows command line?

相关标签:
30条回答
  • 2020-11-22 10:00
    @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.
    
    0 讨论(0)
  • 2020-11-22 10:02

    The one-liner I use in Windows Server 2008 R2 is:

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

    So long as mycommand doesn't require quotes (which screws with cmd's quote processing). The /v:on is to allow for the two different TIME values to be evaluated independently rather than once at the execution of the command.

    0 讨论(0)
  • 2020-11-22 10:02

    Since others are recommending installing things like freeware and PowerShell, you could also install Cygwin, which would give you access to many basic Unix commands like time:

    abe@abe-PC:~$ time sleep 5
    
    real    0m5.012s
    user    0m0.000s
    sys 0m0.000s
    

    Not sure how much overhead Cygwin adds.

    0 讨论(0)
  • 2020-11-22 10:02

    my code gives you the running time in milliseconds, up to 24 hrs, it is locale insensitive, and accounts for negative values if code runs through midnight. it uses delayed expansion, and should be saved in a cmd/bat file.

    before your code:

    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%
    

    after your code:

    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
    

    if you want running time in HH:mm:ss.000 format, add:

    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
    

    variable t2 holds your running time, you can echo %t2% to display it.

    0 讨论(0)
  • 2020-11-22 10:03

    An alternative to measure-time is simply "Get-Date". You don't have that hassle with forwarding output and so on.

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

    Output:

    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
    
    0 讨论(0)
  • 2020-11-22 10:03

    This is a one-liner which avoids delayed expansion, which could disturb certain commands:

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

    The output is something like:

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

    For long-term tests replace $T by $D, $T and %TIME% by %DATE%, %TIME% to include the date.

    To use this inside of a batch file, replace %Z by %%Z.


    Update

    Here is an improved one-liner (without delayed expansion too):

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

    The output looks similar to this:

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

    This approach does not include the process of instancing a new cmd in the result, nor does it include the prompt command(s).

    0 讨论(0)
提交回复
热议问题