【bat】処理の所要時間を測定する方法(%time%活用)

バッチファイルで重い処理や外部コマンドの実行にどれくらい時間がかかるかを測りたい場合、%time% 環境変数を使うのがシンプルな方法です。
%time%HH:MM:SS.mm(時:分:秒.百分の秒)の形式で現在時刻を返すため、処理前後の値を取得して差を計算することで経過時間を測定できます。

%time%の基本

%time% は常に「現在の時刻」を返します。

@echo off
echo 現在時刻は %time%

実行例: 14:32:07.45

処理前後の時間を比較する

バッチでは直接時間計算ができないため、%time% を秒数に変換して引き算します。

@echo off
setlocal enabledelayedexpansion

rem 開始時間を取得
for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
  set /a START=%%a*3600+%%b*60+%%c
)

rem --- 計測したい処理 ---
timeout /t 5 >nul

rem 終了時間を取得
for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
  set /a END=%%a*3600+%%b*60+%%c
)

rem 経過時間を計算
set /a DIFF=%END%-%START%
echo 所要時間: %DIFF% 秒

endlocal

この例では timeout /t 5 により 5 秒待機したので、出力は 所要時間: 5 秒 となります。

日付をまたぐ場合の対処

深夜 23:59 から 00:01 にかけて実行した場合、終了時間が開始時間より小さくなります。その場合は 24 時間分(86400 秒)を加えて補正します。

@echo off
setlocal enabledelayedexpansion

for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
  set /a START=%%a*3600+%%b*60+%%c
)

timeout /t 65 >nul

for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
  set /a END=%%a*3600+%%b*60+%%c
)

if %END% LSS %START% set /a END+=86400
set /a DIFF=%END%-%START%
echo 経過: %DIFF% 秒

endlocal

ミリ秒単位まで測りたいとき

%time% には小数点以下二桁(1/100秒)が含まれるため、より細かい計測も可能です。

@echo off
setlocal enabledelayedexpansion

for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
  set /a START=(%%a*3600+%%b*60+%%c)*100+%%d
)

rem 計測対象
ping -n 4 127.0.0.1 >nul

for /f "tokens=1-4 delims=:.," %%a in ("%time%") do (
  set /a END=(%%a*3600+%%b*60+%%c)*100+%%d
)

if %END% LSS %START% set /a END+=8640000
set /a DIFF=%END%-%START%
set /a SEC=%DIFF%/100, MS=(%DIFF%%%100)*10
echo 経過: %SEC% 秒 %MS% ミリ秒

endlocal

まとめ

バッチで処理時間を測定するには、次の流れが基本です。

  • %time% を取得する
  • 時刻を秒数(または100分の1秒単位)に変換する
  • 開始と終了の差を計算する
  • 日付またぎは 24 時間を加算して補正する

これにより、外部ツールを使わずともバッチだけで処理の所要時間を測れるようになります。ログに残すなどすれば、処理速度の監視やチューニングに役立ちます。