0

したがって、基本的に、マルチキャスト環境からいくつかのパケットをキャプチャする機能があり、それらをファイルに保存してから、マルチキャスト データを期待するアプリケーションにマルチキャストします。シミュレーション目的でこれを行います。これは比較的単純なツールであり、gdb で実行されているアプリケーションに対して 10 または 50K のパケットを再生する場合に役立ちました。私の再生ループは次のようになります。

for (size_t i = 0; i < packets_.size(); ++i)
    publisher_.publish(packets_[i].buf_, packets_[i].len_);

問題は、packets_.size() が約 100 ~ 200K の場合 (それ以上の処理を行う必要はありません)、誰かがリッスンしているときにパケット損失が発生しているように見えることです。これは、それらが 1 つの連続したバーストで再生されるためだと推測しています。次のようなことを試した場合:

for (size_t i = 0; i < packets_.size(); ++i)
{
    if (i % Y == 0) usleep(X);
    publisher_.publish(packets_[i].buf_, packets_[i].len_);
}

Yと(1000/1000 や他の多くのコンボのように)のさまざまな量に対してですXが、これはうまく機能しません。私の推測では、非常に短い時間、すべての反復で噛み砕くサイクルをビジーにすることができれば、これにパッチを当てることができるということでした。ビジーチューは、他のプロセスに譲りたくないため、予想よりも時間がかかりますが、パケットをマルチキャストするのに 200 秒待機する必要があるため、ミリ秒ではなく非常に少量です。ループ内でスリープ関数を繰り返し呼び出すと、結果が得られず、速度が大幅に低下するようです。

または、このユースケースでこれにパッチを適用するためのより良い簡単な方法があるとしたら?

4

2 に答える 2

1

以下の関数は、不特定の時間システムを「ビジー」に保ちます。

static long slow( volatile long l ) {
   while ( l-- > 0 )  ;
   return l ;
}

いくつかの数字、たとえば 1000 を取得して実行slow( N )し、同時にclock_t t = clock()呼び出しの前後にかかった時間を数えます。N を増やして、ループを 1 秒間ビジー状態に保つ数 N が見つかるまで、同じ操作を繰り返します。これで、システムを 1 秒間ビジー状態に保つ機能と数値が得られます。

それが役立つことを願っています。

于 2012-10-19T21:23:30.377 に答える
1

忙しい待機ループは次のとおりです。

#include <chrono>

auto start = std::chrono::high_resolution_clock::now();
while(std::chrono::high_resolution_clock::now()-start < std::chrono::nanoseconds(500))
    ;

待機できる実際の最小時間は、実装の high_resolution_clock の解像度によって異なります。残念ながら、VS2012にはまだ適切な実装がありません。boost::chrono も使用でき、はるかに優れています。

実際にランダムになる時間を探している場合は、<random>ライブラリを使用できます。

#include <random>

std::mt19937 eng;
std::uniform_int_distribution<> dist(200,800);

auto delay = std::chrono::nanoseconds(dist(eng));

CPU を放棄したい場合のために、usleep の C++11 バージョンを次に示します。

#include <thread>

std::this_thread::sleep_for(std::chrono::nanoseconds(500));
于 2012-10-19T21:31:13.813 に答える