Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @ECHO off
- SETLOCAL ENABLEDELAYEDEXPANSION
- :: Small benchmarking script that will tell you how long time it took to call a bat file
- :: version 2 - 2016.06.08 - Fixed so leading zeroes don't fuck up. Both SET /A and PERL are dandy now.
- :: version 2.1 - 2016.07.27 - Vastly improved SET /A, but a lot more complex. Super fast. Removed perl, because this method is rock steady.
- :: version 3 - 2016.07.27 - new features, allowing to loop by specifying number of times at user input
- :: version 3.1 - 2016.07.28 - use arrow up/down to reuse previous commands again, while stille retaining averg values and counter. (detects and removes its own script name, of course)
- SET "_argumentOptionsOriginal=%*"
- SET "_argumentLaunch=%1"
- SET "_argumentOptions=!_argumentOptionsOriginal:%1=!"
- :Reset
- :: Resetting variables to avoid conflicts
- SET "_Input="
- SET "_StartTime="
- SET "_EndTime="
- SET "_RunCounter=1"
- SET "_LoopTimes=0"
- SET "_ResetVar="
- SET "_CPUTime100=0"
- SET "_CPUTimeMinimum100=2000000000"
- SET "_CPUTimeFormatted=0"
- SET "_CurrentAverage100=0"
- SET "_OldCurrentAverage100=0"
- SET "_CurrentAverageFormatted=0"
- SET "_CurrentAverageDelta100=0"
- SET "_CurrentAverageDeltaFormatted=0"
- SET "_CurrentAverageDeltaPercent100=0"
- SET "_CurrentAverageDeltaPercentFormatted=0"
- SET "_ExecutionTime=0"
- SET "_ScriptTimeTaken=0"
- SET "_TotalScriptTimeTaken100=0"
- SET "_TotalScriptTimeTakenFormatted_CurrentAverage100=0"
- :LoopAgain
- CLS
- :: Here we grab start time, execute the script we wanna time, and then grab the end time.
- SET "_StartTime=%TIME%"
- CALL !_argumentLaunch! %_argumentOptions%
- SET "_EndTime=%TIME%"
- :: We add a "1" to M, S, mS so they aren't accidentally read as octals if they show "09".
- FOR /F "tokens=1,2,3,4,5,6,7,8 delims=:., " %%A IN ("%_StartTime%:%_EndTime%") DO ( SET /A "_ScriptTimeTaken=(((%%E*60*60*100)+(1%%F*60*100)+(1%%G*100)+1%%H)-((%%A*60*60*100)+(1%%B*60*100)+(1%%C*100)+1%%D))" )
- :: If midnight transitions between start and end time, we get a negative number.
- IF !_ScriptTimeTaken! LSS 0 ( SET /A _ScriptTimeTaken=_ScriptTimeTaken+8640000 )
- :: Depending on number of millisecs, we have to pad output with "0.0" or "0."
- IF !_ScriptTimeTaken! LEQ 9 ( SET "_ExecutionTime=0.0!_ScriptTimeTaken:~-2!" ) ELSE ( IF !_ScriptTimeTaken! LEQ 99 ( SET "_ExecutionTime=0.!_ScriptTimeTaken:~-2!" ) ELSE ( IF !_ScriptTimeTaken! GEQ 100 ( SET "_ExecutionTime=!_ScriptTimeTaken:~0,-2!.!_ScriptTimeTaken:~-2!" ) ) )
- :: milliseconds spent on this runs multiplied by 100
- SET /A "_CPUTime100=%_ScriptTimeTaken%*100"
- :: minimum time on all runs
- IF !_CPUTime100! LSS !_CPUTimeMinimum100! SET "_CPUTimeMinimum100=!_CPUTime100!"
- :: total milliseconds spent on all runs
- SET /A "_TotalScriptTimeTaken100=%_TotalScriptTimeTaken100%+%_CPUTime100%"
- :: Average milliseconds on all runs multiplied by 100
- SET /A "_CurrentAverage100=%_TotalScriptTimeTaken100%/%_RunCounter%"
- :: Formatted milliseconds spent on this runs with two decimals (already done earlier on)
- SET _CPUTimeFormatted=00000%_CPUTime100%
- SET _CPUTimeFormatted=%_CPUTimeFormatted:~0,-4%.%_CPUTimeFormatted:~-4%
- FOR /F "tokens=* delims=0" %%N IN ("%_CPUTimeFormatted%") DO ( SET "_CPUTimeFormatted=%%N" )
- IF NOT DEFINED _CPUTimeFormatted SET "_CPUTimeFormatted=0.0000"
- IF "!_CPUTimeFormatted:~0,1!"=="." SET "_CPUTimeFormatted=0!_CPUTimeFormatted!"
- :: Formatted minimum milliseconds on all runs
- SET _CPUTimeMinimumFormatted=00000%_CPUTimeMinimum100%
- SET _CPUTimeMinimumFormatted=%_CPUTimeMinimumFormatted:~0,-4%.%_CPUTimeMinimumFormatted:~-4%
- FOR /F "tokens=* delims=0" %%N IN ("%_CPUTimeMinimumFormatted%") DO ( SET "_CPUTimeMinimumFormatted=%%N" )
- IF NOT DEFINED _CPUTimeMinimumFormatted SET "_CPUTimeMinimumFormatted=0.0000"
- IF "!_CPUTimeMinimumFormatted:~0,1!"=="." SET "_CPUTimeMinimumFormatted=0!_CPUTimeMinimumFormatted!"
- :: Formatted total milliseconds spent on all runs
- SET _TotalScriptTimeTakenFormatted=00000%_TotalScriptTimeTaken100%
- SET _TotalScriptTimeTakenFormatted=%_TotalScriptTimeTakenFormatted:~0,-4%.%_TotalScriptTimeTakenFormatted:~-4%
- FOR /F "tokens=* delims=0" %%N IN ("%_TotalScriptTimeTakenFormatted%") DO ( SET "_TotalScriptTimeTakenFormatted=%%N" )
- IF NOT DEFINED _TotalScriptTimeTakenFormatted SET "_TotalScriptTimeTakenFormatted=0.0000"
- IF "!_TotalScriptTimeTakenFormatted:~0,1!"=="." SET "_TotalScriptTimeTakenFormatted=0!_TotalScriptTimeTakenFormatted!"
- :: Formatted average milliseconds spent on all runs
- SET _CurrentAverageFormatted=00000%_CurrentAverage100%
- SET _CurrentAverageFormatted=%_CurrentAverageFormatted:~0,-4%.%_CurrentAverageFormatted:~-4%
- FOR /F "tokens=* delims=0" %%N IN ("%_CurrentAverageFormatted%") DO ( SET "_CurrentAverageFormatted=%%N" )
- IF NOT DEFINED _CurrentAverageFormatted SET "_CurrentAverageFormatted=0.0000"
- IF "!_CurrentAverageFormatted:~0,1!"=="." SET "_CurrentAverageFormatted=0!_CurrentAverageFormatted!"
- :: Average delta since previous run. We prefix with + or -.
- SET /A "_CurrentAverageDelta100=%_CPUTime100%-%_CurrentAverage100%"
- IF "%_CurrentAverageDelta100:~0,1%"=="-" ( SET "_CurrentAverageDelta100=%_CurrentAverageDelta100:~1%" & SET "_prefix=-" ) ELSE ( SET "_prefix=+" )
- SET _CurrentAverageDeltaFormatted=00000%_CurrentAverageDelta100%
- SET _CurrentAverageDeltaFormatted=%_CurrentAverageDeltaFormatted:~0,-4%.%_CurrentAverageDeltaFormatted:~-4%
- FOR /F "tokens=* delims=0" %%N IN ("%_CurrentAverageDeltaFormatted%") DO ( SET "_CurrentAverageDeltaFormatted=%%N" )
- IF NOT DEFINED _CurrentAverageDeltaFormatted SET "_CurrentAverageDeltaFormatted=0.0000"
- IF "!_CurrentAverageDeltaFormatted:~0,1!"=="." SET "_CurrentAverageDeltaFormatted=0!_CurrentAverageDeltaFormatted!"
- SET "_CurrentAverageDeltaFormatted=%_prefix%!_CurrentAverageDeltaFormatted!"
- :: Current run difference in percent compared to current average. We prefix with + or -.
- SET /A "_CurrentAverageDeltaPercent100=(%_CurrentAverageDelta100%*10000)/%_CurrentAverage100%"
- IF "%_CurrentAverageDeltaPercent100:~0,1%"=="-" ( SET "_CurrentAverageDeltaPercent100=%_CurrentAverageDeltaPercent100:~1%" & SET "_prefix=-" ) ELSE ( SET "_prefix=+" )
- SET _CurrentAverageDeltaPercentFormatted=00000%_CurrentAverageDeltaPercent100%
- SET _CurrentAverageDeltaPercentFormatted=%_CurrentAverageDeltaPercentFormatted:~0,-2%.%_CurrentAverageDeltaPercentFormatted:~-2%
- FOR /F "tokens=* delims=0" %%N IN ("%_CurrentAverageDeltaPercentFormatted%") DO ( SET "_CurrentAverageDeltaPercentFormatted=%%N" )
- IF NOT DEFINED _CurrentAverageDeltaPercentFormatted SET "_CurrentAverageDeltaPercentFormatted=0.0000"
- IF "!_CurrentAverageDeltaPercentFormatted:~0,1!"=="." SET "_CurrentAverageDeltaPercentFormatted=0!_CurrentAverageDeltaPercentFormatted!"
- SET "_CurrentAverageDeltaPercentFormatted=%_prefix%!_CurrentAverageDeltaPercentFormatted!"
- :: Output
- ECHO ----------------------------------------------------------------------- 1>&2
- ECHO COMMAND LINE: !_argumentLaunch! !_argumentOptions! 1>&2
- ECHO This run: %_CPUTimeFormatted% sec %_CurrentAverageDeltaFormatted% sec avg %_CurrentAverageDeltaPercentFormatted%%% 1>&2
- ECHO Minimum: %_CPUTimeMinimumFormatted% sec 1>&2
- ECHO Average: %_CurrentAverageFormatted% sec %_TotalScriptTimeTakenFormatted% sec total !_RunCounter! times !_ResetVar! 1>&2
- REM ECHO ELAPSED TIME: %_ExecutionTime% sec 1>&2
- ECHO ----------------------------------------------------------------------- 1>&2
- ECHO. 1>&2
- :: Store the new values as old for the next run
- SET "_OldCPUTime100=%_CPUTime100%"
- SET "_OldScriptTimeTaken100=%_ScriptTimeTaken100%"
- SET "_OldCurrentAverage100=%_CurrentAverage100%"
- :: Here we ask for user input
- IF NOT "!_LoopTimes!"=="0" (
- SET /A _LoopTimes-=1
- REM TIMEOUT /T 1 1>NUL
- GOTO :Continue
- )
- :: Ask for user input. We can use arrow up for easy access to previous command, alter it, and just run it again. if name of this bat script is included in the strin, we strip it to avoid nested launches. Yes, I troubleshooted that that for an hour until I realized why it wasnt working. Duh.
- SET "_Input="
- SET /P "_Input=ENTER/Q/R/#: "
- IF NOT DEFINED _Input GOTO :Continue
- IF /I "!_Input!"=="R" GOTO :Reset
- IF /I "!_Input!"=="Q" GOTO :End
- :: If we made it past the above input checks, we check to see if the input variable consists of only numerical characters.
- SET "_CheckForNumbers="
- FOR /F "delims=0123456789" %%W IN ("!_Input!") DO ( SET "_CheckForNumbers=%%W" )
- IF DEFINED _CheckForNumbers (
- REM :: Not numbers only. We assume it's a new command line we want to run.
- FOR /F "tokens=1,2,* delims= " %%T IN ("!_Input!") DO (
- IF /I "%%T"=="%~nx0" ( SET "_argumentLaunch=%%U" )
- IF /I "%%T"=="%~n0" ( SET "_argumentLaunch=%%U" )
- SET "_argumentOptions=%%V"
- )
- SET /A "_LoopTimes=0"
- ) ELSE (
- REM :: numbers only
- SET /A "_LoopTimes=!_Input!-1"
- IF !_Input! GEQ 20 ( SET "_ResetCounter=10" ) ELSE ( SET "_ResetCounter=" )
- )
- :Continue
- IF DEFINED _ResetCounter ( IF !_RunCounter! EQU !_ResetCounter! ( SET "_ResetVar=^(reset^@!_ResetCounter!^)" & SET "_RunCounter=0" & SET "_ResetCounter=" ) )
- SET /A _RunCounter+=1
- GOTO :LoopAgain
- GOTO :End
- :: Small subroutine to strip CR from the end of strings
- :SetVar
- SET "%~1=%~2"
- GOTO :Eof
- :End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement