2012-02-16 14 views
0

私は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()呼び出しは、実行時間のほとんどを取っていたことがわかりました。メモと同じように、スレッドがスリープしてコンテキストを切り替える余裕がないため、出力レートにジッタが大きくなりすぎます。プロファイルの実行に関する

注:

  1. スレッドの優先順位がProcessPriorityClass.High

私は(C++で)書いた元のプログラムに設定したThreadPriority.Highest

  • プロセスの優先度に設定したが同じことを達成しました効果はQueryPerformanceCounter()QueryPerformanceFrequency()関数を使用しています。 Stopwatchクラスの代わりにPInvokeでこれらの呼び出しを使用すべきですか?または、これを行うための適切な方法がもう1つありますか?

    ありがとうございます!

  • +4

    質問で混乱します。あなたはそこに座っている*タイトループ*何もしないで現在の時間を照会する。あなたのパフォーマンステストがあなたの実行時間の大部分を現在の時間に費やしていることを示していることは驚くべきことではありません! –

    +0

    私は時間がかかることに驚いていませんでしたが、どれくらい時間がかかりました...同等のC++コードは、(周波数仕様内で)必要な時間だけ正確に待機します。ところが、C#コードは 'SpinWait'が実行されたときと比べて非常に遅いです。 – mevatron

    +0

    http://stackoverflow.com/questions/795377/what-if-any-is-the-resource-penalty-for-using-system-diagnostics-stopwatchも参照してください。 – nawfal

    答えて

    1

    で任意の遅延を経験したことがありません、私は私の上記のコードは、要求されたとおりにやっていたことに気づきました。問題は、非常に長い待機時間を与えている抽象度の高いレベルでの呼び出しコードによるものでした。

    System.Windows.Threading.DispatcherTimerSystem.Timers.Timerのおかげでありがとうございました。しかし、これらのそれぞれをテストした後、それらは〜10ミリ秒の精度に制限されています。これは私の目的には十分ではありません。しかし、私は上記の "タイトな"ループコードが〜1マイクロ秒に正確であることがわかりました。これは私の現在のニーズに十分以上です。

    他の人が参考になるかもしれない追加リソースは、Stopwatchの精度を上げることについてのthis CodeProjectの記事です。主なアイデアは、プログラムがコンテクストスイッチに耐えられる可能性を実質的に減らすことで、時間を無駄にするスケジューリングキューを移動することです。

    2

    ストップウォッチは診断名前空間にあります。パフォーマンスレベルのタイミングに使用しないでください。

    おそらくタイマーが必要です。

    2

    System.Windows.Threading.DispatcherTimerを使用してみましたか?

    私はこれでいくつかのプログラムを作成し、そして(エリックリッペルトさんのコメントに触発)いくつかのより多くのデバッグ、後はすべて

    関連する問題