2011-07-23 8 views
11

私はかなりboost :: asioの新機能ですが、私はすでに数年前から存在していて、広くasioを使用しているプロジェクトに取り組んでいます。私の現在の任務は、システムが行っているさまざまなことについて定期的なメトリクスを追加することです。メトリックの1つは、boost :: asio :: io_serviceの作業キューとタイマー・キューが実行時の任意の期間にどれだけ深くなるかを観察することです。だから、私はブーストを頼むことができる必要があります:asio :: io_serviceオブジェクトキュー内のオブジェクトの数。boost :: asio :: io_service占有タイマーとポストのキュー長

次の点を考慮して、私が求めているものを説明するために:

boost::asio::io_service asio_service; 

asio_service.post(boost::bind(do_work, "eat")); 
asio_service.post(boost::bind(do_work, "drink")); 
asio_service.post(boost::bind(do_work, "and be merry!")); 

std::cout << "There are " << asio_service.XXXX() 
      << "things in the post() queue and " 
      << asio_service.YYYY() << " timers" 

は私の「XXXX()」と「YYYY()」呼び出しが何であるかに同等の機能を得るためにブーストASIOを持つ方法はあります表現?

私はasioタイマーのキューコードを見て、キューが本当に単なるベクトルとリストであることに気付きましたが、どちらもプライベートです。プライベートなので、私はアクセス権を継承することはできません。この1組のメトリックのために、奇妙なビジターパターンを継承したり書いたりする必要はありません。これらのカウントへの直接アクセスは、理想的な;ブーストの特別なバージョンでは、私にアクセス権を与えるためにハックアップするのは理想的ではありません。私はこれを行う方法を探しています。うまくいけば私はこれを最初に尋ねるのではない。

答えて

5

io_serviceキューに関する統計情報は、asioライブラリを直接変更することはできません。ご存知のように、コンテナはプライベートです。パフォーマンスやスループットはコンプリートハンドラによって決まるため、キューのサイズは実際にはそれほど重要ではありません。私は似たような解決するために、過去にやったことは、それは質問に対する正確な答えではないという事実にもかかわらず、io_service

void 
Status::impl() 
{ 
    const boost::posix_time::ptime start = boost::posix_time::microsec_clock::local_time(); 
    _io_service.post(
     boost::bind(
      &Status::loadHandler, 
      this, 
      start 
     ) 
    ); 
} 

void 
Status::loadHandler(
    const boost::posix_time::ptime& start, 
    ) 
{ 
    // calculate duration spent in reactor queue 
    const boost::posix_time::ptime end = boost::posix_time::microsec_clock::local_time(); 
    const boost::posix_time::time_duration load = end - start; 
} 
+4

1に些細なハンドラを投稿するために必要な時間を測定することです。キューについての情報を得ることはデバッグに便利です –

+1

キューの長さはパフォーマンスの問題をデバッグするのに絶対に役立ちますが、この小さなハックも大きな助けになります。 – Anne

関連する問題