2013-06-17 12 views
6

私は複数のソースから一度にデータを取り込んで内部データベース(現在はstd::set)に保存するサーバーアプリケーションを作成しています。PPLコンテナの性能

私はMicrosoftのConcRT PPLデータ構造を見て、その効率をstd::unordered_setで細粒度のミューテックスを使用する方法と比較してみました。例えば、2つのコードスニペットの性能差がかなりあります:

void StdWithMutex(void) 
{ 
    std::ofstream outFile("Test.tmp"); 

    std::lock_guard<std::mutex> lockGuard(m_mutex); 

    // Iterate through the data and write it to a file: 
    // m_setData is of type std::unordered_set<DataType> 
    for(auto data : m_setData) 
    { 
      outFile << data; 
    } 
} 

そして:

void ConcRT(void) 
{ 
    std::ofstream outFile("Test.tmp"); 

    // Iterate through the data and write it to a file: 
    // m_setData is of type concurrency::concurrent_unordered_set 
    for(auto data : m_setData) 
    { 
      outFile << data; 
    } 
} 

Moveover、私はよく、私は「なぜである、順番にデータをプリントアウトする必要がありますmはstd::unordered_setとは対照的にstd::setを現在使用していますので、concurrency::concurrent_unordered_setを使用すると利益が得られる場合は、印刷する必要があるたびにデータを並べ替えるコストに近づくでしょうか?

+5

(アイデアの同じ種類でcoostまたはTBB(インテル)の同時コンテナの同時キューは、すべてのロックかもしれないSTLコンテナよりも速くなります)大規模なファイル書き込み細かい? –

+0

あなたがここで達成しようとしていることを解決するのは難しいです。最初のコード例は、セット全体を書き出す全期間にわたってmutexをロックします。すなわち、それはセットを投入するのと同時にではない。 2番目のコード例では、forループのイテレータはおそらく並行安全です。したがって、forループが実行されている間にセットが移入された場合、おそらくforループはロックを取得した場合にのみ終了し、 populateスレッドは新しい値を挿入するためにロックを取得しました。あなたは何を達成しようとしていますか?並行読み取り(ネットワークから)書き込み(ディスクへ)? –

答えて

1

はい、大きな違いがあります。 100個のスレッドをこのコンテナから並列に読み書きしようとすると、その違いがわかります。シングルスレッドenrivronementで>それは 速くなります(それはおそらくSTLながらありませんあなたはこのアロケータを指定した場合を除き、あまりにも自由待つ、または改善アロケータを使用している)

ものの -

PPLコンテナがロックしませんロックのオーバーヘッドがPPLコンテナのオーバーヘッドよりも小さい可能性があります。

の期間中、クラスレベルのmutexロックでどのように