2010-12-20 17 views
5

¿Cómo puedo escribir un archivo por lotes simple para medir el rendimiento de una aplicación basada en consola? La aplicación de consola acepta dos argumentos de línea de comando.¿Cómo puedo usar un archivo por lotes de Windows para medir el rendimiento de la aplicación de la consola?

me gustaría llegar:

StartTime = System Dos time 
myconsoleapp arg1, arg2 
StopTime = System Dos Time 
timeDelta = stoptime - starttime 

que iba a escribir la timedelta a un archivo o una pantalla en la consola.

+0

posible duplicado de [Cómo medir el tiempo de ejecución de comandos en la línea de comandos de Windows?] (Http://stackoverflow.com/questions/673523/how-to-measure-execution-time-of-command-in-windows-command-line) –

+1

Posible duplicado de [¿Cómo puedo medir el tiempo de ejecución de un comando en la línea de comandos de Windows? ?] (https://stackoverflow.com/questions/673523/how-do-i-measure-execution-time-of-a-command-on-the-win dows-command-line) – SteveFest

Respuesta

7

Una solución de lote puro podría ser.

@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 
) 
+1

tenga en cuenta que la extraña variable de configuración de código ms está tratando de evitar la interpretación de 08 como un número octal, mientras dobla parte del cálculo en esa técnica. Un formato más legible sería: SET/A "ms = ((100 \% \% a \% \% 100) * 3600 + (100 \% \% b \% \% 100) * 60 + (100 \% \% c \% \% 100)) * 1000 + (1 \% \% d \% \% 1000) ". Donde 100 %% a %% 100 da el valor de a como un decimal incluso si comienza con un cero, y evita que los errores sobre 08 y 09 no sean válidos octal ("Número inválido. Las constantes numéricas son decimales (17), hexadecimales (0x11) u octal (021). ") – simpleuser

3

Debajo del lote "programa" debe hacer lo que desee. Tenga en cuenta que genera los datos en centisegundos en lugar de milisegundos. La precisión de los comandos usados ​​es de solo centésimos de segundo.

Aquí es un ejemplo de salida:

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

Aquí está la secuencia de comandos por lotes:

@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 
Cuestiones relacionadas