我有一个tbb::concurrent_unordered_map<size_t, std::vector<size_t>>
-或者,一个std::unordered_map<size_t, std::vector<size_t>>
。
在TBB的情况下,通过调用.clear()
或在析构函数运行时清除Map需要更长的时间(根据我的测量,至少是5倍)。我看不出任何并发性问题是导致这种速度下降的原因,因为.clear()
在TBB文档中被特别称为“并发使用不安全”。
为什么TBB的清算速度如此之慢?(我能做些什么吗?)
1条答案
按热度按时间vdgimpew1#
std::unordered_map默认不是线程安全的。您遇到的速度降低可能是由于维护并发访问所需的数据的开销。
您可以尝试使用parallel_for_each算法来迭代Map并并行清除每个元素。在最后,你可以使用.clear()来清除Map。这种方法可能比直接在concurrent_unordered_map上调用.clear()更快。请参阅Pro TBB教科书了解更多信息。
您是否已查看最新的英特尔oneTBB 2021.9?你也可以使用tbb::concurrent_hash_map容器,它支持并发插入、查找和擦除。