4

私が開発しているオープン ソース プロジェクト用に次のコードを最適化する方法、または重い作業を別のスレッドに移動してパフォーマンスを向上させる方法を探しています。

void ProfilerCommunication::AddVisitPoint(ULONG uniqueId)
{
    CScopedLock<CMutex> lock(m_mutexResults);
    m_pVisitPoints->points[m_pVisitPoints->count].UniqueId = uniqueId;
    if (++m_pVisitPoints->count == VP_BUFFER_SIZE)
    {
        SendVisitPoints();
        m_pVisitPoints->count=0;
    } 
}

上記のコードは、各訪問ポイントが呼び出されるときに、OpenCoverプロファイラー (C++ で記述された .NET 用のオープン ソース コード カバレッジ ツール) によって使用されます。ミューテックスは、一部の共有メモリ (32/64 ビットおよび C++/C# の複数のプロセス間で共有される 64K ブロック) を保護するために使用されます。明らかに、これは各計装ポイントにとってかなり重いので、影響を軽くしたいと考えています。

上記の方法でプッシュされるキューと、スレッドを使用してデータをポップし、共有メモリを作成することを考えています。

Q. 私が使用できる C++ (Windows STL) のスレッド セーフ キューはありますか? または、ある問題を別の問題に置き換えたくないので、ロックレス キューはありますか? 人々は私のアプローチを賢明だと考えていますか?


編集 1: インクルード フォルダーに concurrent_queue.h が見つかりました - これが私の答えでしょうか?

4

4 に答える 4

1

さて、私は自分の答えを追加します-concurrent_queueは非常にうまく機能します

このMSDNの記事で説明されている詳細を使用して、並行キュー(およびタスクと最初のC ++ラムダ式:))を実装しました。スパイクであるため、長い間考えていませんでした。

inline void AddVisitPoint(ULONG uniqueId) { m_queue.push(uniqueId); }

...
// somewhere else in code

m_tasks.run([this]
{
    ULONG id;
    while(true)
    {
         while (!m_queue.try_pop(id)) 
            Concurrency::Context::Yield();

        if (id==0) break; // 0 is an unused number so is used to close the thread/task
        CScopedLock<CMutex> lock(m_mutexResults);
        m_pVisitPoints->points[m_pVisitPoints->count].UniqueId = id;
        if (++m_pVisitPoints->count == VP_BUFFER_SIZE)
        {
            SendVisitPoints();
            m_pVisitPoints->count=0;
        }
    }
});

結果:

  • 計装なしのアプリケーション=9.3
  • 古いインストルメンテーションハンドラーを使用したアプリケーション=38.6
  • 新しいインストルメンテーションハンドラーを使用したアプリケーション=16.2
于 2011-08-30T13:46:12.987 に答える
0

クライアントの通信を別のスレッドにオフロードすることは可能でしょうか?次に、検査ポイントはスレッドローカルストレージを使用してヒットを記録でき、ローカルスレッドと通信するだけで、いっぱいになったときに参照を渡すことができます。通信スレッドは、ホットパス上にないため、時間をかけて実際のコレクターにデータを渡すことができます。

于 2011-08-30T12:27:07.070 に答える
0

ロックフリーキューを使用できます。Herb Sutter にはいくつかの記事があります

于 2011-08-30T12:40:53.670 に答える
0

ここでは、すべてのコンテナー操作が Windows でスレッド セーフであるとは限りません。メソッドの数は限られています。また、C++ 標準がスレッドセーフ コンテナについて言及しているとは思えません。私は間違っているかもしれませんが、基準を確認しても何も出てきませんでした

于 2011-08-30T12:23:35.633 に答える