我正在编写一个服务器应用程序,它一次从多个来源获取数据,并将其存储在它的内部数据库(目前是一个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;
}
}和:
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会带来收益,那么潜在的性能收益是否接近每次需要打印数据时重新排序数据的成本?
发布于 2013-09-02 05:29:35
是的,这有很大的不同。尝试运行100个线程并行写入和读取此容器,您将看到不同之处。
PPL容器不会锁定->,这样会更快(它可能也是在等待空闲,或者使用了一个改进的分配器,而STL不会,除非你指定了这个分配器)
在单线程环境中,虽然锁的开销可能比PPL容器的开销小。
(同理,TBB (英特尔)的coost或并发容器的并发队列将比可能全部锁定的STL容器更快)
https://stackoverflow.com/questions/17153171
复制相似问题