В ходе работы над интерпретатором Brainfuck было замечено постоянное порождение дочерних процессов командного процессора cmd. Да и общая скорость работы небольшая. Все дело в вызове функции call.
Читаем хелп:
Поэтому стоит помнить что на каждый вызов подпрограммы через call будет запускаться cmd, на что требуется некоторое время.
Простой тест который делает одно и тоже. Но в первом случае напрямую, во втором через вызов подрограммы.
Читаем хелп:
Команда 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
Комментариев нет:
Отправить комментарий