PR

【PowerShell】コードの時間計測をするスクリプトを作る方法

OSS開発

スクリプトを書いていると、「どちらの方が早いコードなのだろうか」と疑問に思うことがあります。

そんなときに便利なPowerShellスクリプトを解説します。

WordPressブロガーの方必見! 外出先でもブログ執筆作業がはかどる、 Ankerの大容量モバイルバッテリー をご紹介します。

コードの時間を計測するスクリプトを作ってみた

下記のスクリプトをコピペしてください。

PowerShell
# 引数に渡した関数やスクリプトの時間計測をする
Param(
    $arg # 引数
)

$scriptBlock = [scriptblock]::Create("$arg")
$elapsedTime = Measure-Command -Expression $scriptBlock
Write-Host "経過時間: $($elapsedTime.TotalSeconds)"

上記のスクリプトをmeasure.ps1としてPATHが通っているフォルダに保存します。

「PATH通し」に関して詳細を知りたい方は、以下の記事をご参照ください。

使い方

Powershellを立ち上げ、以下のようにmeasure "測定したいコード"と打つと、そのコードの計測時間が出力されます。

PowerShell
> measure "測定したいコード"
経過時間: 0.1874129

もし、コードが長く一行に収まらない場合は、スクリプトファイルそのものを引数に渡すことができます。

PowerShell
> measure "./hoge.ps1"

また、PATHに通っているスクリプトファイルや、エイリアスに登録されている関数も、そのまま引き渡せます。

PowerShell
> measure "エイリアスに登録している関数"
> measure "PATHに通っているスクリプト"

エイリアスへの登録方法は以下の記事をご参照ください。

さらに、スクリプトは「オプション込み」で渡すことも出来ます。

PowerShell
> measure "hoge -C"

注意点

注意点は2つあります。

  1. ひとつ目は、「引数に渡したコードは実行される」ということです。速度だけを調べるつもりでスクリプトを渡しても、計測した上でコードも実行されるため、きちんと精査されていないコードは予期せぬ結果を招く可能性があります
  2. もうひとつは、ターミナルに出力する「Write-Hostは実行されない」ことです。正確には実行されていますが、ターミナルには表示されません

構造

ポイントはMeasure-Commandです。
「Measure-Command」は、PowerShellスクリプトやコマンドの実行にかかる時間を計測するためのコマンドレットです。

テンプレートを下記のように少し変えます。

PowerShell
# 引数に渡した関数やスクリプトの時間計測をする
Param(
    $arg # 引数
)

$scriptBlock = [scriptblock]::Create("$arg")
$elapsedTime = Measure-Command -Expression $scriptBlock
$elapsedTime

この状態で実行すると、Measure-Commandが何をしているか分かります。

PowerShell
> 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構造を、後者は文字数を出力するツールです。

では、速度を計測してみます。

PowerShell
> speed "marktree -c"
経過時間: 0.3957906
> speed "clipcount"
経過時間: 0.3723626

上記のようにスクリプトの計測時間が出力されました。

まとめ

この記事では、PowerShellを使用してコードの実行時間を計測するスクリプトを作成する方法を解説しました。

テンプレートを貼り付けてスクリプトファイルを作成すれば、スクリプトファイル名 コマンドと実行することで、コマンドの実行速度を調べることができます。ただし、引数に渡すコマンドは出力結果が表示されないものの、実行は正しく行われます。そのため、きちんと精査されていないコードは予期せぬ結果を招く可能性があるため、注意が必要です

タイトルとURLをコピーしました