PowerShellで処理時間や処理の区間時間(ラップタイム)を計測する方法
本エントリーの目次
PowerShellで、処理の実行に要した時間を計測したい!
PowerShellスクリプトの処理中で、処理の実行に要した時間を計測しておきたい!
と考えることがあります。
たとえば時間がかかる処理や、処理の実行にかかる時間が実行する度に異なるような処理について、その処理時間を計測。
そしてそれをログに記録しておき、スクリプトの実行速度の改善や実行計画の検討に役立てる※、といったケースが挙げられます。
※深夜などの業務時間外に、PowerShellスクリプトの実行が終わるようにタスクの開始時間を設定するなど。
そこで今回は、PowerShellで処理にかかった時間を計測する方法をご紹介します!
また、処理の区間時間(ラップタイム)を計測する方法についてもご紹介しますので、ぜひ参考になさってください!
PowerShellで、処理にかかった時間を計測する方法
PowerShellで、処理にかかった時間を計測したい場合には、以下のような方法で対応可能です。
時間計測用の専用のコマンドレットを使用する方法
PowerShellには、処理の実行に要した時間を計測するための専用のコマンドレット、『Measure-Command』が用意されています。
そのため、このコマンドレットを使用する方法が最も簡単でおすすめできる方法です。
『Measure-Command』コマンドレットは、以下のような構文で使用します。
1 2 3 | Measure-Command{ #時間を計測したい処理 } |
使い方はとっても簡単で、処理時間を計測したい部分を『Measure-Command{}』のカッコ内に記述するだけでOKです。
今回の説明では、実行に時間がかかる処理の代用として、PowerShellの処理を一定時間停止する『Start-Sleep』コマンドレットを使ってご説明しましょう。
3秒間処理を一時停止する処理である『Start-Sleep -Seconds 3』の実行時間を計測したい場合には、以下のような記述を行います。
1 2 3 4 5 6 | Measure-Command{ #3秒間、処理を一時停止する。 Start-Sleep -Seconds 3 } |
上記PowerShellスクリプトを実行すると、以下のような結果が標準出力されます。
1 2 3 4 5 6 7 8 9 10 11 | Days : 0 Hours : 0 Minutes : 0 Seconds : 3 Milliseconds : 4 Ticks : 30044146 TotalDays : 3.47733171296296E-05 TotalHours : 0.000834559611111111 TotalMinutes : 0.0500735766666667 TotalSeconds : 3.0044146 TotalMilliseconds : 3004.4146 |
秒単位の処理時間は『TotalSeconds』に格納されており、上記実行例では実行に要した時間は『3.0044146』秒ということです。
またミリ秒単位の時間を取得したい場合には、『TotalMilliseconds』に格納されている情報を参照すると良いでしょう。
秒単位の時間のみを出力したい場合には、以下のような記述で対応可能です。
1 | (Measure-Command{Start-Sleep -Seconds 3}).TotalSeconds |
※『Start-Sleep -Seconds 3』の部分は計測したい処理に書き換えて使用してください。
また、出力を『処理にかかった時間:x.xxx … 秒』といった形式としたい場合には、以下のような記述を行います。
1 | Write-Host ("処理にかかった時間:" + (Measure-Command{Start-Sleep -Seconds 3}).TotalSeconds + "秒") |
『Measure-Command』コマンドレットの結果は変数に取得可能!
『Measure-Command』コマンドレットの結果は、TimeSpan型(構造体)で取得されます。
そのため、『Measure-Command』コマンドレットの結果を変数に取得・格納することも、もちろん可能です。
参考:Microsoft Docs – TimeSpan 構造体
たとえば『Measure-Command』コマンドレットの結果を、$TimeSpan変数に取得。
そして処理の実行に要した時間(秒 = TotalSeconds)を、『処理にかかった時間:x.xxx … 秒』という形式で標準出力したい場合には、以下のような記述を行います。
1 2 3 4 5 6 7 | $TimeSpan = Measure-Command{ Start-Sleep -Seconds 3 } Write-Host ("処理にかかった時間:" + $TimeSpan.TotalSeconds + "秒") |
TimeSpan型の変数は、書式指定文字列を使うことで、指定した形式の文字列に変換、取得することが可能です。
処理の実行に要した時間を『x日x時間x分x秒xxx』(末尾はミリ秒)の形式で取得したいときは、以下のような記述を行ってください。
1 | Write-Host $TimeSpan.ToString("d'日'h'時間'm'分's'秒'fff") |
書式指定文字列についての詳細は、以下Microsoftさんのドキュメントも参考になさってください。
参考:Microsoft Docs – カスタム TimeSpan 書式指定文字列
また書式指定文字列を設定・検討する際は、指定の期間情報が格納されているTimeSpan型の変数があると便利でしょう。
PowerShellでTimeSpan型の変数を用意する際は、以下のようなコマンドを実行します。
1 2 | #1日2時間3分4秒という期間情報を格納したTimeSpan型の変数$TimeSpanを用意する $TimeSpan = New-TimeSpan -Days 1 -Hours 2 -Minutes 3 -Seconds 4 |
開始時間と終了時間の差を計算して処理時間を取得する方法
ある処理の実行に要した時間は、以下のような記述により処理の開始時間と終了時間の差を計算することでも取得可能です。
1 2 3 4 5 6 7 | $StartTime = Get-Date #時間を計測したい処理をここに記述する $StopTime = Get-Date Write-Host ($StopTime - $StartTime).TotalSeconds |
$StartTimeと$StopTime変数には、DateTime型のオブジェクトが取得されます。
そしてPowerShellでは、DateTimeオブジェクト同士の差を計算すると、TimeSpanオブジェクトが取得される仕様です。
したがって先ほどご紹介した書式指定文字列を指定することで、処理に要した時間を指定した形式の文字列に変換、取得できます。
PowerShellで、処理の区間時間(ラップタイム)を計測する方法
PowerShellで、処理の区間時間(ラップタイム)を計測したい場合には、開始時間と終了時間の差を計算して処理時間を計測する方法を応用することで対応可能です。
たとえば、あるPowerShellスクリプトファイル内で、処理1~3の実行にかかった区間時間と、全処理時間を計測したい場合には、以下のような記述により計測が可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | $Dates = @() #処理の開始時間を記録する $Dates += Get-Date #処理1を実行する Start-Sleep -Seconds 1 $Dates += Get-Date #処理の終了時間を記録 #処理2を実行する Start-Sleep -Seconds 3 $Dates += Get-Date #処理の終了時間を記録 #処理3を実行する Start-Sleep -Seconds 5 $Dates += Get-Date #処理の終了時間を記録 if ($Dates.Length -eq 0){ Write-Host "処理時間の計測が開始していません。" } elseif ($Dates.Length -eq 1){ Write-Host "処理時間の計測が終了していません。" } else { for ($i=0; $i -lt ($Dates.Length - 1); $i++){ Write-Host ("計測区間" + ($i + 1) + "の処理時間:" + ($Dates[$i + 1] - $Dates[$i]).TotalSeconds + "秒") } Write-Host ("------------------------------------------`r`n全処理時間:" + ($Dates[-1] - $Dates[0]).TotalSeconds + "秒") } |
上記PowerShellスクリプトを実行すると、以下のような結果が標準出力されます。
1 2 3 4 5 | 計測区間1の処理時間:1.0055353秒 計測区間2の処理時間:3.0105296秒 計測区間3の処理時間:5.003764秒 ------------------------------------------ 全処理時間:9.0198289秒 |
以上、参考になさってくださーい!