6

一度に複数のソースからデータを取得し、それを内部データベース (現在はstd::set) に格納するサーバー アプリケーションを作成しています。

私はちょうど 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、私はしばしばデータを順番に出力する必要があります。そのため、私は現在 ではstd::setなく を使用してstd::unordered_setconcurrency::concurrent_unordered_setます。印刷する必要がありますか?

4

1 に答える 1

1

はい、大きな違いがあります。このコンテナーからの書き込みと読み取りを並行して 100 スレッドで実行してみると、違いがわかります。

PPL コンテナーはロックされません -> より高速になります (このアロケーターを指定した場合を除いて、STL はそうではありませんが、おそらく待機フリーであるか、改善されたアロケーターを使用しています)

シングル スレッド環境では、ロックのオーバーヘッドが PPL コンテナーのオーバーヘッドよりも小さい可能性があります。

(同じ種類のアイデアで、coost の同時キューまたは TBB (intel) の同時コンテナは、すべてロックする可能性のある STL コンテナよりも高速になります)

于 2013-09-01T21:29:34.693 に答える