6

我正在编写一个服务器应用程序,它一次从多个来源获取数据并将其存储在它的内部数据库中(目前是一个std::set)。

我刚刚查看了 Microsoft 的 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;
     }
}

和:

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;
     }
}

此外,我经常需要按顺序打印数据,这就是我目前使用的原因std::set,而不是std::unordered_set,所以如果使用 有增益,concurrency::concurrent_unordered_set潜在的性能增益是否会接近每次重新排序数据的成本需要打印吗?

4

1 回答 1

1

是的,有很大的不同。尝试运行 100 个线程并行读写这个容器,你会看到差异。

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

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

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

于 2013-09-01T21:29:34.693 回答