私は複数のソースから一度にデータを取り込んで内部データベース(現在は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
を使用すると利益が得られる場合は、印刷する必要があるたびにデータを並べ替えるコストに近づくでしょうか?
(アイデアの同じ種類でcoostまたはTBB(インテル)の同時コンテナの同時キューは、すべてのロックかもしれないSTLコンテナよりも速くなります)大規模なファイル書き込み細かい? –
あなたがここで達成しようとしていることを解決するのは難しいです。最初のコード例は、セット全体を書き出す全期間にわたってmutexをロックします。すなわち、それはセットを投入するのと同時にではない。 2番目のコード例では、forループのイテレータはおそらく並行安全です。したがって、forループが実行されている間にセットが移入された場合、おそらくforループはロックを取得した場合にのみ終了し、 populateスレッドは新しい値を挿入するためにロックを取得しました。あなたは何を達成しようとしていますか?並行読み取り(ネットワークから)書き込み(ディスクへ)? –