System.Diagnostics.Stopwatchクラスが、短期間(つまり20秒)でも測定値が不正確になることが判明しました。私のプロセスは、20秒を実行するためにコード化されたプロセスのための20.3+秒の経過時間を示している。Powershellタイマー/ストップウォッチの精度
$elapsed = [System.Diagnostics.Stopwatch]::StartNew()
write-host "Started at $(get-date)"
for ($t=1; $t -le 20; $t++) {
Write-Host "Elapsed Time: $($elapsed.Elapsed.ToString())"
sleep 1
}
write-host "Ended at $(get-date)"
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())"
Started at 02/02/2013 15:08:43
Elapsed Time: 00:00:00.0329924
Elapsed Time: 00:00:01.0417435
Elapsed Time: 00:00:02.0547547
Elapsed Time: 00:00:03.0689716
Elapsed Time: 00:00:04.0820497
Elapsed Time: 00:00:05.0963413
Elapsed Time: 00:00:06.1113915
Elapsed Time: 00:00:07.1244044
Elapsed Time: 00:00:08.1396105
Elapsed Time: 00:00:09.1528952
Elapsed Time: 00:00:10.1659905
Elapsed Time: 00:00:11.1800884
Elapsed Time: 00:00:12.1940009
Elapsed Time: 00:00:13.2081824
Elapsed Time: 00:00:14.2223585
Elapsed Time: 00:00:15.2375023
Elapsed Time: 00:00:16.2506360
Elapsed Time: 00:00:17.2656845
Elapsed Time: 00:00:18.2790676
Elapsed Time: 00:00:19.2928700
Ended at 02/02/2013 15:09:04
Total Elapsed Time: 00:00:20.3080067
はPowerShellのストップウォッチクラスを使用する際に予想される精度ドリフトのこの種のですか?時間のスパンに比例して増加しているように見えます(つまり、10秒は0.1秒、20秒は0.3減少しています)。私のコードは間違っていますか?
Write-Host呼び出しの開始と終了を取り除くと、それはもっと近くなるはずです。ストップウォッチはWindowsの高頻度カウンターAPIを使用しているため、かなり正確です。 –
Rynant、それは20秒です。しかし、それはもはやストップウォッチではなく、ただスリープタイマーです。それは、睡眠が完了するまでスクリプトの実行を停止します。私はプロセスを実行し、最後に完了までにどれくらいの時間がかかるか教えてください。 –
私はあなたが私の例のポイントを逃したと思う。私は 'Diagnostics.Stopwatch'クラスが不正確ではないことを証明しようとしていました。あなたのスクリプトのストップウォッチが "20.3080067"秒を表示する理由は、あなたのスクリプトがスリープ状態以外のことをしているからです。また、 'Get-Date'ステートメントが正確に20秒離れているように見える理由は、表示された時刻が最も近い秒に丸められているためです。 – Rynant