пятница, 1 июля 2011 г.

Об оптимизации скорости работы bat-файлов

В ходе работы над интерпретатором Brainfuck было замечено постоянное порождение дочерних процессов командного процессора cmd. Да и общая скорость работы небольшая. Все дело в вызове функции call.

Читаем хелп:


Команда CALL допускает использование меток в качестве адресата вызова.
Применяется следующий синтаксис:
    CALL :метка аргументы
При вызове создается новый контекст текущего пакетного файла с заданными аргументами, и управление передается на инструкцию, расположенную сразу после метки.  Для выхода из такого пакетного файла необходимо дважды достичь его конца.  Первый выход возвращает управление на инструкцию, расположенную сразу после строки CALL, а второй выход завершает выполнение пакетного файла.
Команда GOTO /? выводит описание расширения GOTO :EOF, позволяющее выполнить
быстрый возврат из пакетного файла.

Поэтому стоит помнить что на каждый вызов подпрограммы через call будет запускаться cmd, на что требуется некоторое время.
Простой тест который делает одно и тоже. Но в первом случае напрямую, во втором через вызов подрограммы.
@echo off
setlocal ENABLEDELAYEDEXPANSION ENABLEEXTENSIONS

echo %time% - start test1
set a=0
for /l %%i in (1,1,1000) do set /a a=!a!+1
echo %a%
echo %time% - end test1
echo --------------
echo %time% - start test2
set a=0
for /l %%i in (1,1,1000) do call :m1
echo %a%
echo %time% - end test2
goto :eof

:m1
set /a a=%a%+1
exit /b /0
Как говорится, комментарии излишни.

Комментариев нет: