2 Stimmen

Wie kann ich die Zeit messen, die für jede Iteration einer for-Schleife benötigt wird?

Wie kann ich ein Skript wie dieses verwenden, um die Zeit zu messen, die jede Iteration einer for-Schleife in einem Stapelskript dauert? Ich habe dies implementiert, um die Ausführungszeit eines gesamten Skripts aufzuzeichnen, aber ich würde gerne Dauern für jede Iteration einer for-Schleife erhalten.

    @echo off

    rem ******************  HAUPTCODE-ABSCHNITT
    set STARTTIME=%TIME%

    rem Ihr Code kommt hierhin (entfernen Sie die ping-Zeile)
    ping -n 4 -w 1 127.0.0.1 >NUL

    set ENDTIME=%TIME%

    rem ******************  ENDE HAUPTCODE-ABSCHNITT

    rem Ändern des Formats für Start- und Endzeiten
    for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do (
       set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
    )

    for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do (
       set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
    )

    rem Berechnen der vergangenen Zeit durch Subtrahieren von Werten
    set /A elapsed=end-start

    rem Formatieren der Ergebnisse für die Ausgabe
    set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
    if %hh% lss 10 set hh=0%hh%
    if %mm% lss 10 set mm=0%mm%
    if %ss% lss 10 set ss=0%ss%
    if %cc% lss 10 set cc=0%cc%

    set DURATION=%hh%:%mm%:%ss%,%cc%

    echo Start    : %STARTTIME%
    echo Finish   : %ENDTIME%
    echo          ---------------
    echo Duration : %DURATION% 

Ausgabe:

    Start    : 11:02:45.92
    Finish   : 11:02:48.98
             ---------------
    Duration : 00:00:03,06

BEARBEITEN: So sieht meine Implementierung aus

@ECHO on
setlocal enabledelayedexpansion
cls

RMDIR c:\path1 /s /q
mkdir c:\path1
xcopy "\\path2\*" c:\path1 /s /i
cd c:\path3

for /f "tokens=*" %%a in ('dir /b /od') do set newest=%%a
cd c:\path1

sqlcmd -S server -i "\\path2\DropDatabases.sql"

for /D /r %%F IN ("*") DO ( 
    for %%G  IN ("%%F\*.extenstion1") DO xcopy "%%G" c:\path2\%newest% /y /i

    for /l %%A in (1,1,5) do (
        set STARTTIME=!TIME!

    for /f "delims=_" %%J IN ('forfiles /p "%%F" /m *.jmpt /c "cmd /c echo @path"')  DO start "program"  /D "c:\path3" /Wait program -r  %%J

    set ENDTIME=!TIME!
call :GetDuration !STARTTIME! !ENDTIME! 
    )
)

    exit /b
    :GetDuration
    set function_starttime=%1
    set function_endtime=%2

    rem Ändern des Formats für die Start- und Endzeiten
    for /F "tokens=1-4 delims=:.," %%a in ("%function_starttime%") do (
        set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)

    for /F "tokens=1-4 delims=:.," %%a in ("%function_endtime%") do (
        set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)

    rem Berechnen der vergangenen Zeit durch Subtrahieren von Werten
    set /A elapsed=end-start

    rem Formatieren der Ergebnisse für die Ausgabe
    set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
    if %hh% lss 10 set hh=0%hh%
    if %mm% lss 10 set mm=0%mm%
    if %ss% lss 10 set ss=0%ss%
    if %cc% lss 10 set cc=0%cc%

    set DURATION=%hh%:%mm%:%ss%.%cc%

    echo Start    : %function_starttime%
    echo Finish   : %function_endtime%
    echo          ---------------
    echo Duration : %DURATION%
    echo.

sqlcmd -S server -i "\\path2\query.sql"

pause

2voto

SomethingDark Punkte 13748

Legen Sie die Startzeit- und Endzeitvariablen am Anfang bzw. am Ende des Inneren Ihres For-Loop-Codeblocks fest und platzieren Sie den gesamten Konvertierungs- und Ausgabecode in eine Funktion. Sie müssen auch die verzögerte Erweiterung aktivieren.

@echo off
setlocal enabledelayedexpansion
cls

rem ******************  HAUPTCODE ABSCHNITT
for /l %%A in (1,1,5) do (
    set STARTTIME=!TIME!

    rem Ihr Code kommt hier (entfernen Sie die ping-Zeile)
    ping -n 3 -w 1 127.0.0.1 >NUL

    set ENDTIME=!TIME!
    call :GetDuration !STARTTIME! !ENDTIME!
)

rem ******************  ENDE HAUPTCODE ABSCHNITT
exit /b

:GetDuration
set function_starttime=%1
set function_endtime=%2

rem Ändern Sie das Format für die Start- und Endzeiten
for /F "tokens=1-4 delims=:.," %%a in ("%function_starttime%") do (
   set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)

for /F "tokens=1-4 delims=:.," %%a in ("%function_endtime%") do (
   set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100"
)

rem Berechnen Sie die vergangene Zeit, indem Sie Werte subtrahieren
set /A elapsed=end-start

rem Formatieren Sie die Ergebnisse für die Ausgabe
set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
if %hh% lss 10 set hh=0%hh%
if %mm% lss 10 set mm=0%mm%
if %ss% lss 10 set ss=0%ss%
if %cc% lss 10 set cc=0%cc%

set DURATION=%hh%:%mm%:%ss%.%cc%

echo Start    : %function_starttime%
echo Finish   : %function_endtime%
echo          ---------------
echo Duration : %DURATION%
echo.

0voto

Timur Izmaylov Punkte 1

Es gibt ein sehr schönes Paket namens "tictoc" Sie setzen einfach tic() am Anfang einer Schleife und toc() am Ende einer Schleife. Nach jeder Iteration sehen Sie die genaue Zeit in Sekunden, die dafür aufgewendet wurde.

Weitere Informationen finden Sie hier

https://cran.rproject.org/web/packages/tictoc/tictoc.pdf

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X