How can I use a Windows batch file to measure the performance of console application?

前端 未结 2 404
无人及你
无人及你 2020-12-19 13:28

How can I write a simple batch file to measure the performance of a console-based application? The console application accepts two command line arguments.

I would li

相关标签:
2条回答
  • 2020-12-19 14:00

    Below batch "program" should do what you want. Please note that it outputs the data in centiseconds instead of milliseconds. The precision of the used commands is only centiseconds.

    Here is an example output:

    STARTTIME: 13:42:52,25
    ENDTIME: 13:42:56,51
    STARTTIME: 4937225 centiseconds
    ENDTIME: 4937651 centiseconds
    DURATION: 426 in centiseconds
    00:00:04,26
    

    Here is the batch script:

    @echo off
    setlocal
    
    rem The format of %TIME% is HH:MM:SS,CS for example 23:59:59,99
    set STARTTIME=%TIME%
    
    rem here begins the command you want to measure
    dir /s > nul
    rem here ends the command you want to measure
    
    set ENDTIME=%TIME%
    
    rem output as time
    echo STARTTIME: %STARTTIME%
    echo ENDTIME: %ENDTIME%
    
    rem convert STARTTIME and ENDTIME to centiseconds
    set /A STARTTIME=(1%STARTTIME:~0,2%-100)*360000 + (1%STARTTIME:~3,2%-100)*6000 + (1%STARTTIME:~6,2%-100)*100 + (1%STARTTIME:~9,2%-100)
    set /A ENDTIME=(1%ENDTIME:~0,2%-100)*360000 + (1%ENDTIME:~3,2%-100)*6000 + (1%ENDTIME:~6,2%-100)*100 + (1%ENDTIME:~9,2%-100)
    
    rem calculating the duratyion is easy
    set /A DURATION=%ENDTIME%-%STARTTIME%
    
    rem we might have measured the time inbetween days
    if %ENDTIME% LSS %STARTTIME% set set /A DURATION=%STARTTIME%-%ENDTIME%
    
    rem now break the centiseconds down to hors, minutes, seconds and the remaining centiseconds
    set /A DURATIONH=%DURATION% / 360000
    set /A DURATIONM=(%DURATION% - %DURATIONH%*360000) / 6000
    set /A DURATIONS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000) / 100
    set /A DURATIONHS=(%DURATION% - %DURATIONH%*360000 - %DURATIONM%*6000 - %DURATIONS%*100)
    
    rem some formatting
    if %DURATIONH% LSS 10 set DURATIONH=0%DURATIONH%
    if %DURATIONM% LSS 10 set DURATIONM=0%DURATIONM%
    if %DURATIONS% LSS 10 set DURATIONS=0%DURATIONS%
    if %DURATIONHS% LSS 10 set DURATIONHS=0%DURATIONHS%
    
    rem outputing
    echo STARTTIME: %STARTTIME% centiseconds
    echo ENDTIME: %ENDTIME% centiseconds
    echo DURATION: %DURATION% in centiseconds
    echo %DURATIONH%:%DURATIONM%:%DURATIONS%,%DURATIONHS%
    
    endlocal
    goto :EOF
    
    0 讨论(0)
  • 2020-12-19 14:04

    A pure batch solution could be.

    @echo off
    set "startTime=%time%"
    for /L %%n in (1,1, 1000) do <nul set /p "="
    set "stopTime=%time%"
    call :timeDiff diff startTime stopTime
    echo %diff% milli seconds
    goto :eof
    
    :timeDiff
    setlocal
    call :timeToMS time1 "%~2"
    call :timeToMS time2 "%~3"
    set /a diff=time2-time1
    (
      ENDLOCAL
      set "%~1=%diff%"
      goto :eof
    )
    
    :timeToMS
    ::### WARNING, enclose the time in " ", because it can contain comma seperators
    SETLOCAL EnableDelayedExpansion
    FOR /F "tokens=1,2,3,4 delims=:,.^ " %%a IN ("!%~2!") DO (
      set /a "ms=(((30%%a%%100)*60+7%%b)*60+3%%c-42300)*1000+(1%%d0 %% 1000)"
    )
    (
      ENDLOCAL
      set %~1=%ms%
      goto :eof
    )
    
    0 讨论(0)
提交回复
热议问题