Git Bash を使ってプログラムを並列で実行したときの処理時間を測定する

はじめに

プログラムを並列実行したいとき、コマンドプロンプトではstartコマンドがあります。 しかしstartで実行した処理の終了を捕捉するのは簡単にはできないと思います。 (私が知らないだけかもしれませんが。)
そうなると、並列実行した時のすべての処理が終わるまでの時間を測定するのも難しくなります。
そこで bash を使って実行時間の測定を行いたいと思います。
Windowsbash 環境はおそらく Git をインストールしているならば利用できるであろう Git Bash がポピュラーと思われるので、 今回は Git Bash で動作させる場合を想定します。

環境

スクリプトと実行結果

最初にスクリプトと実行結果を載せます。 今回は実行したい処理をsleepに置き換えていますが、Visual Studio でビルドした実行ファイルでも動きます。

スクリプト

func () {
  sleep 8 &
  sleep 10 &
  sleep 6 &
  wait
}

time func

実行結果

real    0m10.170s
user    0m0.016s
sys     0m0.199s

解説と参考URL

時間を測定する

bash での時間測定はtimeコマンドを使います。

【 time 】コマンド(bash)――コマンドの実行時間を計測する:Linux基本コマンドTips(251) - @IT

他にdateコマンドとbcコマンドを使う方法がありました。

コマンドの実際の実行時間を `time` コマンドを使わずに計測する - Qiita

今回やりたい計測では、複数のコマンドを実行するので、 一連の処理をdateで挟んで計測するこちらの方法が適してるかと思ったのですが、 Git Bash ではbcコマンドが使用できません。 なのでtimeコマンドを使います。

ちなみに、下記の質問のコメントで知ったのですが、bcコマンドはbashコマンドではないそうです。

how to install and where to install bash bc on windows - Stack Overflow

サブルーチンにする

timeコマンドで実行するために、計測する処理全体をサブルーチンにまとめます。 個人的にシェルスクリプトのサブルーチンはCライクに書けるのでbatのに比べて好きです。

シェルスクリプト 関数・サブルーチン

並列で実行し処理の完了まで待機する

並列で実行するためにバックグラウンドで実行します。 バックグラウンドで実行するためには、コマンドの最後に& を付けます。 上で示したスクリプトから&を消せば順次実行になり、処理時間は24秒になります。
処理の完了まで待機するためには、waitコマンドを使用します。

【wait】Linuxで指定したプロセス・ジョブの終了を待つコマンド | UX MILK

課題

Git Bash がインストールされていない Windows 環境で同様のことできるようにしたいです。 例えば WSH とか PowerShell とかで出来る方法を見つけたいです。