2010-12-20 9 views
5

कंसोल-आधारित एप्लिकेशन के प्रदर्शन को मापने के लिए मैं एक साधारण बैच फ़ाइल कैसे लिख सकता हूं? कंसोल एप्लिकेशन दो कमांड लाइन तर्क स्वीकार करता है।कंसोल एप्लिकेशन के प्रदर्शन को मापने के लिए मैं विंडोज बैच फ़ाइल का उपयोग कैसे कर सकता हूं?

मैं प्राप्त करना चाहते हैं:

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

मैं एक फ़ाइल या कंसोल पर प्रदर्शित करने के लिए timeDelta लिखेंगे।

+0

के संभावित डुप्लिकेट [खिड़कियों कमांड लाइन में आदेश के निष्पादन के समय को मापने के लिए कैसे?] (Http://stackoverflow.com/questions/673523/how-to-measure-execution-time-of-command-in-windows-command-line) –

+1

संभावित डुप्लिकेट [मैं विंडोज कमांड लाइन पर कमांड के निष्पादन समय को कैसे मापूं ?] (https://stackoverflow.com/questions/673523/how-do-i-measure-execution-time-of-a-command-on-the-win डॉव्स-कमांड-लाइन) – SteveFest

उत्तर

7

एक शुद्ध बैच समाधान हो सकता है।

@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

ध्यान दें कि अजीब कोड सेटिंग वेरिएबल एमएस उस तकनीक में गणना के भाग को फोल्ड करते समय, एक ऑक्टल संख्या के रूप में 08 को समझने से बचने का प्रयास कर रहा है। एक और पठनीय प्रारूप होगा: एसईटी/ए "एमएस = ((100 \% \% एक \% \% 100) * 3600 + (100 \% \% बी \% \% 100) * 60 + (100 \% \% सी \% \% 100)) * 1000 + (1 \% \% डी \% \% 1000) "। जहां 100 %% एक %% 100 शून्य के साथ शुरू होने पर भी दशमलव के मान को देता है, और 08 और 09 के बारे में त्रुटियों से बचाता है जो वैध ऑक्टल नहीं है ("अमान्य संख्या। संख्यात्मक स्थिरांक या तो दशमलव (17), हेक्साडेसिमल (0x11), या ऑक्टल (021)। ") – simpleuser

3

बैच "प्रोग्राम" के नीचे जो भी आप चाहते हैं उसे करना चाहिए। कृपया ध्यान दें कि यह मिलीसेकंड के बजाय सेंटीसेकंड में डेटा आउटपुट करता है। प्रयुक्त आदेशों की सटीकता केवल सेंटसेकंड है।

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

यहाँ बैच स्क्रिप्ट है:

यहाँ एक उदाहरण उत्पादन होता है

@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 
संबंधित मुद्दे