スクリプトを書いていると、「どちらの方が早いコードなのだろうか」と疑問に思うことがあります。
そんなときに便利なPowerShellスクリプトを解説します。
コードの時間を計測するスクリプトを作ってみた
下記のスクリプトをコピペしてください。
# 引数に渡した関数やスクリプトの時間計測をする
Param(
$arg # 引数
)
$scriptBlock = [scriptblock]::Create("$arg")
$elapsedTime = Measure-Command -Expression $scriptBlock
Write-Host "経過時間: $($elapsedTime.TotalSeconds) 秒"
上記のスクリプトをmeasure.ps1
としてPATHが通っているフォルダに保存します。
「PATH通し」に関して詳細を知りたい方は、以下の記事をご参照ください。
使い方
Powershellを立ち上げ、以下のようにmeasure "測定したいコード"
と打つと、そのコードの計測時間が出力されます。
> measure "測定したいコード"
経過時間: 0.1874129 秒
もし、コードが長く一行に収まらない場合は、スクリプトファイルそのものを引数に渡すことができます。
> measure "./hoge.ps1"
また、PATHに通っているスクリプトファイルや、エイリアスに登録されている関数も、そのまま引き渡せます。
> measure "エイリアスに登録している関数"
> measure "PATHに通っているスクリプト"
エイリアスへの登録方法は以下の記事をご参照ください。
さらに、スクリプトは「オプション込み」で渡すことも出来ます。
> measure "hoge -C"
注意点
注意点は2つあります。
- ひとつ目は、「引数に渡したコードは実行される」ということです。速度だけを調べるつもりでスクリプトを渡しても、計測した上でコードも実行されるため、きちんと精査されていないコードは予期せぬ結果を招く可能性があります。
- もうひとつは、ターミナルに出力する「
Write-Host
は実行されない」ことです。正確には実行されていますが、ターミナルには表示されません。
構造
ポイントはMeasure-Command
です。
「Measure-Command」は、PowerShellスクリプトやコマンドの実行にかかる時間を計測するためのコマンドレットです。
テンプレートを下記のように少し変えます。
# 引数に渡した関数やスクリプトの時間計測をする
Param(
$arg # 引数
)
$scriptBlock = [scriptblock]::Create("$arg")
$elapsedTime = Measure-Command -Expression $scriptBlock
$elapsedTime
この状態で実行すると、Measure-Command
が何をしているか分かります。
> measure "hoge"
Days : 0
Hours : 0
Minutes : 0
Seconds : 0
Milliseconds : 181
Ticks : 1812199
TotalDays : 2.0974525462963E-06
TotalHours : 5.03388611111111E-05
TotalMinutes : 0.00302033166666667
TotalSeconds : 0.1812199
TotalMilliseconds : 181.2199
Measure-Command
は、コードの実行時間を「時」「分」「秒」「日」に換算し、それぞれの値を取得できるようになっています。もし、長時間かかるコードを計測する場合は、$elapsedTime.TotalMinutes
や$elapsedTime.TotalHours
を使用すると便利です。
[scriptblock]::Create(コード)
は、渡した引数をスクリプトブロックに変換するメソッドです。変換することでMeasure-Command
で計測できるようになります。
コードの時間を計測するスクリプトを使ってみる
自分が作った「marktree」と「clipcount」の時間計測をしてみます。
どちらも文章を読み込み、前者はtree構造を、後者は文字数を出力するツールです。
では、速度を計測してみます。
> speed "marktree -c"
経過時間: 0.3957906 秒
> speed "clipcount"
経過時間: 0.3723626 秒
上記のようにスクリプトの計測時間が出力されました。
まとめ
この記事では、PowerShellを使用してコードの実行時間を計測するスクリプトを作成する方法を解説しました。
テンプレートを貼り付けてスクリプトファイルを作成すれば、スクリプトファイル名 コマンド
と実行することで、コマンドの実行速度を調べることができます。ただし、引数に渡すコマンドは出力結果が表示されないものの、実行は正しく行われます。そのため、きちんと精査されていないコードは予期せぬ結果を招く可能性があるため、注意が必要です。