PPL容器性能

Tho*_*ell 6 c++ concurrency stl c++11 ppl

我正在编写一个Server应用程序,它一次从多个源获取数据并将其存储在其内部数据库中(当前为a std::set).

我一直在关注微软的ConcRT PPL数据结构,并想知道它们的效率与使用细粒度互斥锁相比如何std::unordered_set.例如,两个代码片段之间是否有很多性能差异:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

和:

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;
     }
}
Run Code Online (Sandbox Code Playgroud)

Moveover,我经常需要打印出来的数据才能,这就是为什么我目前使用std::set而不是std::unordered_set,所以如果在使用的增益concurrency::concurrent_unordered_set,将接近每一次重新排序的数据的成本的潜在性能增益它需要打印?

dza*_*ada 1

是的,存在巨大差异。尝试运行 100 个线程并行写入和读取此容器,您将看到差异。

PPL 容器不会锁定 -> 它会更快(它可能也是免费等待的,或者使用改进的分配器,而 STL 则不会,除非您指定了此分配器)

在单线程环境中,尽管锁的开销可能小于 PPL 容器的开销。

(同样的想法,TBB(intel)的coost或并发容器的并发队列将比可能全部锁定的STL容器更快)