2013-02-03 27 views
5

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減少しています)。私のコードは間違っていますか?

答えて

2

、何をやろうとしているが、 ?スクリプトの実行にかかる時間を正確に判断しようとする場合は、ストップウォッチを使用する必要があります。ただし、指定した期間後に新しいコマンドシーケンスを開始しようとする場合は、[System.Timers.Timer]を使用して、timerオブジェクトのelapsedイベントのイベントを登録します。次に、登録イベントのアクションを、達成しようとしているものに指定します。

17

あなたは20秒の休止をしていますが、あなたは他のことも続けています。変数をインクリメントしてテストするループがあり、各繰り返しで経過時間を書きます。これらの余分なものは時間がかかります。

これはまだ20秒間のポーズを持っており、PowerShellが関係していることをあまり余分なものがあるので、経過時間が20秒に近い:質問がある

$elapsed = [System.Diagnostics.Stopwatch]::StartNew() 
write-host "Started at $(get-date)" 
sleep 20 
write-host "Ended at $(get-date)" 
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())" 
+2

Write-Host呼び出しの開始と終了を取り除くと、それはもっと近くなるはずです。ストップウォッチはWindowsの高頻度カウンターAPIを使用しているため、かなり正確です。 –

+0

Rynant、それは20秒です。しかし、それはもはやストップウォッチではなく、ただスリープタイマーです。それは、睡眠が完了するまでスクリプトの実行を停止します。私はプロセスを実行し、最後に完了までにどれくらいの時間がかかるか教えてください。 –

+0

私はあなたが私の例のポイントを逃したと思う。私は 'Diagnostics.Stopwatch'クラスが不正確ではないことを証明しようとしていました。あなたのスクリプトのストップウォッチが "20.3080067"秒を表示する理由は、あなたのスクリプトがスリープ状態以外のことをしているからです。また、 'Get-Date'ステートメントが正確に20秒離れているように見える理由は、表示された時刻が最も近い秒に丸められているためです。 – Rynant