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

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

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

目次

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

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

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

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

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

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

あわせて読みたい
Windowsで環境変数「PATH」を設定する方法 この記事では「Windowsで環境変数PATHを設定する方法」を解説しています。Powershellのバージョンによって、環境変数の設定方法は異なるため注意が必要です。

コードの時間を計測するスクリプトの使い方

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

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

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

PowerShell
> measure "./hoge.ps1"

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

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

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

あわせて読みたい
【簡単!】windowsでエイリアスを設定する方法【Powershell】 本記事では、WindowsのPowershellでエイリアス(Alias)を設定するための二種類の方法を解説します。一つは「Set-Alias」を使う方法で、もう一つは「関数」を使う方法です。

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

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

あわせて読みたい
【個人開発】Markdownを木構造で出力できる「marktree」 「文章全体を一目で把握したい」と思ったことはないでしょうか? 「marktree」を使えばtreeコマンドのような木構造を一瞬で生成することができます。
あわせて読みたい
【個人開発】文字数を計測できる「clipcount」 「clipcount」は、クリップボードからテキストを読み込み、文字数を計測するOSSです。半角英数を0.5文字に換算するオプションも備えるため、ブログ執筆で役立ちます。

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

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

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

まとめ

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

テンプレートを貼り付けてスクリプトファイルを作成すれば、スクリプトファイル名 コマンドと実行することで、コマンドの実行速度を調べることができます。

ただし、引数に渡すコマンドは出力結果が表示されないものの、実行は正しく行われます。そのため、きちんと精査されていないコードは予期せぬ結果を招く可能性があるため、注意が必要です

よろしければハートマークを押してくださると幸いです!
大変励みになります😄
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次