📂

batファイル、途中処理で処理は早くなるの?

2024/10/26に公開

こんなのを書きました。
https://zenn.dev/yuhi_ili/articles/62c87d5558b0bc

これ、変数が入った瞬間に実行したら早いのでは?
ということで試していきましょう!

コード

処理時間を調べるコードはこちらを使いました。
https://qiita.com/nkojima/items/12776ca5351d682d919f

t1.bat
@echo off
setlocal enabledelayedexpansion

set start_time=%time%

rem 実行を入力
if "%1"=="" (set c=1) else (set c=%1)
for /l %%i in (1,1,%c%) do (
for /F "delims=" %%f in ('dir %CD%\in /b /o:-D') do set fname=%%f
move %CD%\in\!fname! %CD%\out
)

set end_time=%time%

echo %start_time%
echo %end_time%
t2.bat
@echo off
setlocal enabledelayedexpansion

set start_time=%time%

rem 実行を入力
if "%1"=="" (set c=1) else (set c=%1) & set /a i=0
for /F "delims=" %%f in ('dir %CD%\in /b /o:-D') do (set fname=%%f
move %CD%\in\!fname! %CD%\out & set /a i+=1 
if !i! EQU !c! ( goto skip )
)

:skip
set end_time=%time%

echo %start_time%
echo %end_time%
a.py
for i in range(1000):
	with open(f"in\{i}.txt","w") as f:
		f.write(f"{i}")
dd.py
del in\*.txt
del out\*.txt

t1が旧コード、t2が新コードです。
時間計測をできるようにし、カレントディレクトリのinフォルダーにあるテキストファイルをoutフォルダーに移動するように変更しています。
また、t2はexit /bを行っているので、goto skipに変更しました。

動作確認

> ./t1.bat
        1 個のファイルを移動しました。
 1:55:47.57
 1:55:47.71
> ./t2.bat
        1 個のファイルを移動しました。
 1:55:48.65
 1:55:48.72

処理時間はt1が0.14秒、t2が0.07秒となりました。
この時点で結果が見えそうですが・・・まぁいいでしょう。

検証

a.pyで作成した1000個のテキストファイルを移動させます。

> ./t1.bat 1000
        1 個のファイルを移動しました。
        ~~~~~
        1 個のファイルを移動しました。
 1:56:54.81
 1:57:57.05
> ./t2.bat 1000
        1 個のファイルを移動しました。
        ~~~~~
        1 個のファイルを移動しました。
 1:58:20.53
 1:58:22.49

処理時間はt1が57.76秒、t2が1.96秒となりました。

結論

t1は後半になるにつれスクロールが早くなりました。一方でt2は最初から爆速で流れていきました。
すごい最適化されましたね。

おまけ

batch、実はネストしたfor文でgotoが使えません。breakも不可能です。gotoが実質的なbreakなのにね。
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/for_in_do/4-1324.html

使えないよ!.bat
@echo off
for %%i in (1,2,3) do (
for %%j in (4,5,6) do (
echo %%j
goto a
)
:a
echo %%i
)

これを実行するとこのようになると思いますよね?

1
4
5
6
2
4
5
6
3
4
5
6

でもなりません。

4
%i

・・・それがなんだって話ですね。

なぜこの内容を打ったかというと、最初にこのようなコードを実装しようとしていました。最終的にexit \bを使うことにしました。goto :EOFでもいいです。
gotoで実装したい人は参考になるサイトを貼っておきます。
https://www.dostips.com/forum/viewtopic.php?t=3457
batchは人類には早すぎるすばらしいクソ言語です!
まぁ作られた当時のマシンスペックを考えると妥当かな・・・。

参考文献

https://tounderlinedk.blogspot.com/2011/08/exit-goto-eof-windowsbatcmd.html

更新履歴

コードの調整。それにともない再検証。

Discussion