はじめに
プログラムを並列実行したいとき、コマンドプロンプトではstart
コマンドがあります。
しかしstart
で実行した処理の終了を捕捉するのは簡単にはできないと思います。
(私が知らないだけかもしれませんが。)
そうなると、並列実行した時のすべての処理が終わるまでの時間を測定するのも難しくなります。
そこで bash を使って実行時間の測定を行いたいと思います。
Windows の bash 環境はおそらく Git をインストールしているならば利用できるであろう Git Bash がポピュラーと思われるので、
今回は Git Bash で動作させる場合を想定します。
環境
- Windows 10
- Git 2.22.0
スクリプトと実行結果
最初にスクリプトと実行結果を載せます。
今回は実行したい処理を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 とかで出来る方法を見つけたいです。