私は33ms +/-数ミリ秒の固定間隔でパケットを送信する必要のあるアプリケーションを持っています。System.Diagnostics.Stopwatchクラスは、繰り返し呼び出されたときに通常遅くなりますか?
だから、私は以下のようSpinTimer
クラスを思い付いた:
class SpinTimer
{
public void SpinWait(double waitTimeInSeconds)
{
if (waitTimeInSeconds < 0.0)
{
throw new ArgumentOutOfRangeException("waitTimeInSeconds", "Must be >= 0.0");
}
Stopwatch timer = new Stopwatch();
double elapsed = 0.0;
timer.Start();
do
{
elapsed = (double)timer.ElapsedTicks/(double)Stopwatch.Frequency;
} while (elapsed < waitTimeInSeconds);
}
}
しかし、コードをプロファイリングした後、私はSystem.Diagnostics.Stopwatch.GetTimestamp()
呼び出しは、実行時間のほとんどを取っていたことがわかりました。メモと同じように、スレッドがスリープしてコンテキストを切り替える余裕がないため、出力レートにジッタが大きくなりすぎます。プロファイルの実行に関する
注:
- スレッドの優先順位が
ProcessPriorityClass.High
私は(C++で)書いた元のプログラムに設定したThreadPriority.Highest
QueryPerformanceCounter()
とQueryPerformanceFrequency()
関数を使用しています。 Stopwatch
クラスの代わりにPInvokeでこれらの呼び出しを使用すべきですか?または、これを行うための適切な方法がもう1つありますか? ありがとうございます!
質問で混乱します。あなたはそこに座っている*タイトループ*何もしないで現在の時間を照会する。あなたのパフォーマンステストがあなたの実行時間の大部分を現在の時間に費やしていることを示していることは驚くべきことではありません! –
私は時間がかかることに驚いていませんでしたが、どれくらい時間がかかりました...同等のC++コードは、(周波数仕様内で)必要な時間だけ正確に待機します。ところが、C#コードは 'SpinWait'が実行されたときと比べて非常に遅いです。 – mevatron
http://stackoverflow.com/questions/795377/what-if-any-is-the-resource-penalty-for-using-system-diagnostics-stopwatchも参照してください。 – nawfal