7

私はC#でUDPマルチキャストクライアント/サーバーペアを作成していますが、サーバーの伝送速度を調整するには、50〜100 µsec(マイクロ秒)のオーダーの遅延が必要です。これは、重大なパケット損失を回避するのに役立ち、ディスクI/Oバウンドのクライアントに過負荷をかけないようにするのにも役立ちます。Thread.SleepまたはThread.SpinWaitを提案しないでください。どちらかが必要かどうかは尋ねません。

私が最初に考えたのは、ある種の高性能カウンターを使用して、経過時間をチェックする単純なwhile()ループを実行することでしたが、それは厄介だと感じるので避けたいと思います。それはまた、サーバープロセスのCPU使用率を固定しませんか?

クロスプラットフォームソリューションのボーナスポイント、つまりWindows固有ではありません。よろしくお願いします!

4

6 に答える 6

9

非常に短いスリープ時間は、通常、CPU スピン ループ (説明したようなもの) によって最もよく達成されます。高精度のタイマー呼び出しは、それ自体が時間を消費し、結果をゆがめる可能性があるため、通常は使用を避けたいと考えています。このような短い待機時間のために、サーバーの CPU ペギングについてあまり心配する必要はありません。

次のように、動作をクラスにカプセル化します。

  • 静的コンストラクターがスピン ループを数百万回繰り返し実行し、かかる時間をキャプチャするクラスを作成します。これにより、基盤となるハードウェアで 1 つのループ サイクルにかかる時間がわかります。
  • 任意のスリープ時間を計算するために使用できる uS/反復値を計算します。
  • 特定の期間スリープするように求められた場合、uS to sleep を以前に計算された uS/反復値で割り、実行するループ反復の回数を特定します。
  • 推定時間が経過するまで while ループを使用してスピンします。
于 2009-10-27T15:20:07.357 に答える
7

ストップウォッチを使用しますが、ループが必要です

これを読んで、ElapsedMicroseconds などのストップウォッチに拡張機能を追加します

または、このようなものも機能する可能性があります

System.Diagnostics.Stopwatch.IsHighResolutionはtrue でなければなりません

    static void Main(string[] args)
    {
        Stopwatch sw;
        sw = Stopwatch.StartNew();
        int i = 0;

        while (sw.ElapsedMilliseconds <= 5000)
        {
            if (sw.Elapsed.Ticks % 100 == 0)
            { i++; /* do something*/ }
        }
        sw.Stop();


    }
于 2009-10-27T15:20:00.853 に答える
1

マルチキャスト アプリケーションでより精度が必要なときに、このような要件を経験しました。

この例に示すように、マルチメディア タイマーを使用するのが最善の解決策であることがわかりました。

私はこの実装を使用し、それに TPL 非同期呼び出しを追加しました。詳細については、私のSimpleMulticastAnalyzerプロジェクトを参照してください。

于 2013-04-01T01:36:06.973 に答える
1
    static void udelay(long us)
    {
        var sw = System.Diagnostics.Stopwatch.StartNew();
        long v = (us * System.Diagnostics.Stopwatch.Frequency )/ 1000000;
        while (sw.ElapsedTicks < v)
        {
        }
    }
    static void Main(string[] args)
    {
        for (int i = 0; i < 100; i++)
        {
            Console.WriteLine("" + i + " " + DateTime.Now.Second + "." + DateTime.Now.Millisecond);
            udelay(1000000);
        }
    }
于 2016-10-22T22:06:37.220 に答える
0

マルチメディアタイマーを見たことがありますか?おそらく、API 呼び出しをラップする .NET ライブラリがどこかにあるはずです。

于 2009-10-27T15:43:04.470 に答える
0

ブロッキングスレッドを消費して作成するため、スピンループの使用はお勧めしません。thread.sleep の方が優れています。スリープ中にプロセッサ リソースを使用せず、時間をスライスするだけです。試してみると、タスク マネージャーから、スピン ループで CPU 使用率がどのように急増するかがわかります。

于 2013-03-08T13:07:07.163 に答える