call命令のオーバーヘッド〜添え字付き環境変数へのセット

前回書いた環境変数へセットする方式の tail コマンドでは、添え字付き環境変数へのセットで、call 命令を使う。前回書いたような eval 的な call の使い方と、実際にサブルーチンコールする場合とでの処理時間を念のため計ってみた。

for /l %%I in (1,1,1000) do set J=%%I&call set SAVE%%J%%=1

と、

for /l %%I in (1,1,1000) do set J=%%I&call :sub SAVE%%J%%
goto :eof
:sub
set %1=1
goto :eof

の処理時間を計ってみると、意外なことに、前者が5.5秒、後者が4.5秒とサブルーチンコールのほうが速い。
制御が行って戻る分だけ遅い気がするのだが、繰り返し回数を増やしたり、= の右辺をなくしてセットでなくアンセットにしても同じで、必ずサブルーチンコールのほうが早い。前回書いた tail コマンドでは、call が2回出てくるのでこれをまとめてひとつのサブルーチンコールに変えればさらに速くなるはずだ。

(前略)
echo.%%A>%TEMPFILE%
call :sub SAVE%%J%% SAVE%%I%%
(中略)
:sub
set /p %1=< %TEMPFILE%
set %2=
goto :eof

(1) 前回の中間ファイル方式と、(2) 改訂版中間ファイル方式で、同じファイルで実行してみたところ、
(1) 21秒
(2) 17秒
と少しだが速くなった。(1) の時間が前回と違うのはバックグラウンドプロセスやメモリ状況の違いであろう。前回・今回とも数回計ったが誤差は1秒以内である。