Advertisement
unknown14725

benchX.bat

Aug 13th, 2019
143
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Batch 9.13 KB | None | 0 0
  1. @ECHO  off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3.  
  4. :: Small benchmarking script that will tell you how long time it took to call a bat file
  5. :: version 2   - 2016.06.08 - Fixed so leading zeroes don't fuck up. Both SET /A and PERL are dandy now.
  6. :: 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.
  7. :: version 3   - 2016.07.27 - new features, allowing to loop by specifying number of times at user input
  8. :: 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)
  9.  
  10. SET "_argumentOptionsOriginal=%*"
  11. SET "_argumentLaunch=%1"
  12. SET "_argumentOptions=!_argumentOptionsOriginal:%1=!"
  13.  
  14.  
  15. :Reset
  16. :: Resetting variables to avoid conflicts
  17. SET "_Input="
  18. SET "_StartTime="
  19. SET "_EndTime="
  20. SET "_RunCounter=1"
  21. SET "_LoopTimes=0"
  22. SET "_ResetVar="
  23.  
  24. SET "_CPUTime100=0"
  25. SET "_CPUTimeMinimum100=2000000000"
  26. SET "_CPUTimeFormatted=0"
  27. SET "_CurrentAverage100=0"
  28. SET "_OldCurrentAverage100=0"
  29.  
  30. SET "_CurrentAverageFormatted=0"
  31. SET "_CurrentAverageDelta100=0"
  32. SET "_CurrentAverageDeltaFormatted=0"
  33. SET "_CurrentAverageDeltaPercent100=0"
  34. SET "_CurrentAverageDeltaPercentFormatted=0"
  35. SET "_ExecutionTime=0"
  36. SET "_ScriptTimeTaken=0"
  37. SET "_TotalScriptTimeTaken100=0"
  38. SET "_TotalScriptTimeTakenFormatted_CurrentAverage100=0"
  39.  
  40.  
  41. :LoopAgain
  42. CLS
  43.  
  44. :: Here we grab start time, execute the script we wanna time, and then grab the end time.
  45. SET "_StartTime=%TIME%"
  46. CALL !_argumentLaunch! %_argumentOptions%
  47. SET "_EndTime=%TIME%"
  48.  
  49.  
  50. :: We add a "1" to M, S, mS so they aren't accidentally read as octals if they show "09".
  51. 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))" )
  52. :: If midnight transitions between start and end time, we get a negative number.
  53. IF !_ScriptTimeTaken! LSS 0 ( SET /A _ScriptTimeTaken=_ScriptTimeTaken+8640000 )
  54. :: Depending on number of millisecs, we have to pad output with "0.0" or "0."
  55. 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!" ) ) )
  56.  
  57. :: milliseconds spent on this runs multiplied by 100
  58. SET /A "_CPUTime100=%_ScriptTimeTaken%*100"
  59.  
  60. :: minimum time on all runs
  61. IF !_CPUTime100! LSS !_CPUTimeMinimum100! SET "_CPUTimeMinimum100=!_CPUTime100!"
  62.  
  63. :: total milliseconds spent on all runs
  64. SET /A "_TotalScriptTimeTaken100=%_TotalScriptTimeTaken100%+%_CPUTime100%"
  65. :: Average milliseconds on all runs multiplied by 100
  66. SET /A "_CurrentAverage100=%_TotalScriptTimeTaken100%/%_RunCounter%"
  67.  
  68. :: Formatted milliseconds spent on this runs with two decimals (already done earlier on)
  69. SET _CPUTimeFormatted=00000%_CPUTime100%
  70. SET _CPUTimeFormatted=%_CPUTimeFormatted:~0,-4%.%_CPUTimeFormatted:~-4%
  71. FOR /F "tokens=* delims=0" %%N IN ("%_CPUTimeFormatted%") DO ( SET "_CPUTimeFormatted=%%N" )
  72. IF NOT DEFINED _CPUTimeFormatted SET "_CPUTimeFormatted=0.0000"
  73. IF "!_CPUTimeFormatted:~0,1!"=="." SET "_CPUTimeFormatted=0!_CPUTimeFormatted!"
  74.  
  75. :: Formatted minimum milliseconds on all runs
  76. SET _CPUTimeMinimumFormatted=00000%_CPUTimeMinimum100%
  77. SET _CPUTimeMinimumFormatted=%_CPUTimeMinimumFormatted:~0,-4%.%_CPUTimeMinimumFormatted:~-4%
  78. FOR /F "tokens=* delims=0" %%N IN ("%_CPUTimeMinimumFormatted%") DO ( SET "_CPUTimeMinimumFormatted=%%N" )
  79. IF NOT DEFINED _CPUTimeMinimumFormatted SET "_CPUTimeMinimumFormatted=0.0000"
  80. IF "!_CPUTimeMinimumFormatted:~0,1!"=="." SET "_CPUTimeMinimumFormatted=0!_CPUTimeMinimumFormatted!"
  81.  
  82. :: Formatted total milliseconds spent on all runs
  83. SET _TotalScriptTimeTakenFormatted=00000%_TotalScriptTimeTaken100%
  84. SET _TotalScriptTimeTakenFormatted=%_TotalScriptTimeTakenFormatted:~0,-4%.%_TotalScriptTimeTakenFormatted:~-4%
  85. FOR /F "tokens=* delims=0" %%N IN ("%_TotalScriptTimeTakenFormatted%") DO ( SET "_TotalScriptTimeTakenFormatted=%%N" )
  86. IF NOT DEFINED _TotalScriptTimeTakenFormatted SET "_TotalScriptTimeTakenFormatted=0.0000"
  87. IF "!_TotalScriptTimeTakenFormatted:~0,1!"=="." SET "_TotalScriptTimeTakenFormatted=0!_TotalScriptTimeTakenFormatted!"
  88.  
  89. :: Formatted average milliseconds spent on all runs
  90. SET _CurrentAverageFormatted=00000%_CurrentAverage100%
  91. SET _CurrentAverageFormatted=%_CurrentAverageFormatted:~0,-4%.%_CurrentAverageFormatted:~-4%
  92. FOR /F "tokens=* delims=0" %%N IN ("%_CurrentAverageFormatted%") DO ( SET "_CurrentAverageFormatted=%%N" )
  93. IF NOT DEFINED _CurrentAverageFormatted SET "_CurrentAverageFormatted=0.0000"
  94. IF "!_CurrentAverageFormatted:~0,1!"=="." SET "_CurrentAverageFormatted=0!_CurrentAverageFormatted!"
  95.  
  96. :: Average delta since previous run. We prefix with + or -.
  97. SET  /A "_CurrentAverageDelta100=%_CPUTime100%-%_CurrentAverage100%"
  98. IF "%_CurrentAverageDelta100:~0,1%"=="-" ( SET "_CurrentAverageDelta100=%_CurrentAverageDelta100:~1%" & SET "_prefix=-" ) ELSE ( SET "_prefix=+" )
  99. SET _CurrentAverageDeltaFormatted=00000%_CurrentAverageDelta100%
  100. SET _CurrentAverageDeltaFormatted=%_CurrentAverageDeltaFormatted:~0,-4%.%_CurrentAverageDeltaFormatted:~-4%
  101. FOR /F "tokens=* delims=0" %%N IN ("%_CurrentAverageDeltaFormatted%") DO ( SET "_CurrentAverageDeltaFormatted=%%N" )
  102. IF NOT DEFINED _CurrentAverageDeltaFormatted SET "_CurrentAverageDeltaFormatted=0.0000"
  103. IF "!_CurrentAverageDeltaFormatted:~0,1!"=="." SET "_CurrentAverageDeltaFormatted=0!_CurrentAverageDeltaFormatted!"
  104. SET "_CurrentAverageDeltaFormatted=%_prefix%!_CurrentAverageDeltaFormatted!"
  105.  
  106.  
  107. :: Current run difference in percent compared to current average. We prefix with + or -.
  108. SET  /A "_CurrentAverageDeltaPercent100=(%_CurrentAverageDelta100%*10000)/%_CurrentAverage100%"
  109. IF "%_CurrentAverageDeltaPercent100:~0,1%"=="-" ( SET "_CurrentAverageDeltaPercent100=%_CurrentAverageDeltaPercent100:~1%" & SET "_prefix=-" ) ELSE ( SET "_prefix=+" )
  110. SET _CurrentAverageDeltaPercentFormatted=00000%_CurrentAverageDeltaPercent100%
  111. SET _CurrentAverageDeltaPercentFormatted=%_CurrentAverageDeltaPercentFormatted:~0,-2%.%_CurrentAverageDeltaPercentFormatted:~-2%
  112. FOR /F "tokens=* delims=0" %%N IN ("%_CurrentAverageDeltaPercentFormatted%") DO ( SET "_CurrentAverageDeltaPercentFormatted=%%N" )
  113. IF NOT DEFINED _CurrentAverageDeltaPercentFormatted SET "_CurrentAverageDeltaPercentFormatted=0.0000"
  114. IF "!_CurrentAverageDeltaPercentFormatted:~0,1!"=="." SET "_CurrentAverageDeltaPercentFormatted=0!_CurrentAverageDeltaPercentFormatted!"
  115. SET "_CurrentAverageDeltaPercentFormatted=%_prefix%!_CurrentAverageDeltaPercentFormatted!"
  116.  
  117.  
  118. :: Output
  119. ECHO ----------------------------------------------------------------------- 1>&2
  120. ECHO   COMMAND LINE:  !_argumentLaunch! !_argumentOptions! 1>&2
  121. ECHO   This run: %_CPUTimeFormatted% sec        %_CurrentAverageDeltaFormatted% sec avg      %_CurrentAverageDeltaPercentFormatted%%%  1>&2
  122. ECHO   Minimum:  %_CPUTimeMinimumFormatted% sec       1>&2
  123. ECHO   Average:  %_CurrentAverageFormatted% sec         %_TotalScriptTimeTakenFormatted% sec total       !_RunCounter! times !_ResetVar! 1>&2
  124. REM ECHO   ELAPSED TIME:  %_ExecutionTime% sec 1>&2
  125. ECHO ----------------------------------------------------------------------- 1>&2
  126. ECHO.  1>&2
  127.  
  128.  
  129. :: Store the new values as old for the next run
  130. SET "_OldCPUTime100=%_CPUTime100%"
  131. SET "_OldScriptTimeTaken100=%_ScriptTimeTaken100%"
  132. SET "_OldCurrentAverage100=%_CurrentAverage100%"
  133.  
  134.  
  135.  
  136. :: Here we ask for user input
  137. IF NOT "!_LoopTimes!"=="0" (
  138.     SET /A _LoopTimes-=1
  139.    REM TIMEOUT /T 1 1>NUL
  140.     GOTO :Continue
  141. )
  142.  
  143.  
  144.  
  145. :: 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.
  146. SET "_Input="
  147. SET /P "_Input=ENTER/Q/R/#: "
  148. IF NOT DEFINED _Input  GOTO :Continue
  149. IF /I "!_Input!"=="R"  GOTO :Reset
  150. IF /I "!_Input!"=="Q"  GOTO :End
  151.  
  152. :: If we made it past the above input checks, we check to see if the input variable consists of only numerical characters.
  153. SET "_CheckForNumbers="
  154. FOR /F "delims=0123456789" %%W IN ("!_Input!") DO ( SET "_CheckForNumbers=%%W" )
  155. IF DEFINED _CheckForNumbers (
  156.    REM :: Not numbers only. We assume it's a new command line we want to run.
  157.     FOR /F "tokens=1,2,* delims= " %%T IN ("!_Input!") DO (
  158.         IF /I "%%T"=="%~nx0" ( SET "_argumentLaunch=%%U" )
  159.         IF /I "%%T"=="%~n0" ( SET "_argumentLaunch=%%U" )
  160.         SET "_argumentOptions=%%V"
  161.     )
  162.     SET /A "_LoopTimes=0"
  163. ) ELSE (
  164.    REM :: numbers only
  165.     SET /A "_LoopTimes=!_Input!-1"
  166.     IF !_Input! GEQ 20 ( SET "_ResetCounter=10" ) ELSE ( SET "_ResetCounter=" )
  167. )
  168.  
  169.  
  170. :Continue
  171. IF DEFINED _ResetCounter ( IF !_RunCounter! EQU !_ResetCounter! ( SET "_ResetVar=^(reset^@!_ResetCounter!^)" & SET "_RunCounter=0" & SET "_ResetCounter=" ) )
  172. SET /A _RunCounter+=1
  173.  
  174. GOTO :LoopAgain
  175.  
  176. GOTO :End
  177.  
  178.  
  179. :: Small subroutine to strip CR from the end of strings
  180. :SetVar
  181.     SET "%~1=%~2"
  182. GOTO :Eof
  183.  
  184. :End
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement