为什么对排序向量的二进制搜索比std :: set find慢?

时间:2016-11-24 19:36:56

标签: c++ performance c++11 vector set

在这里,您可以看到代码,运行它并查看时间。

http://rextester.com/MNQZS47293

我在我的机器上得到了类似的结果(使用相同版本的MSVC),向量中的查找比std :: set中的查找慢。

由于数据的更好的局部性(更多缓存友好),我希望排序的矢量版本更快。 在更糟糕的情况下,我希望它们是相似的,因为它们都执行二进制搜索,但我无法理解为什么std :: set比排序的矢量版本快得多。

非常感谢

编辑:抱歉,我粘贴了错误的链接(我修改了代码但忘了复制链接)旧代码使用的是unordered_set,这段代码使用了一个集合,问题仍然是一样的:为什么是二进制文件搜索比一组慢的排序向量?我注意到如果元素的数量足够大,那么排序后的矢量会更快,但我仍然无法理解为什么该集合可以胜过任意数量元素的排序矢量。

2 个答案:

答案 0 :(得分:2)

链接代码似乎使用unordered_set,而不是set

unordered_set是一个哈希表。搜索是二进制搜索。在那里,搜索性能取决于散列函数和负载因子。

答案 1 :(得分:1)

更新问题:

File -> Import -> General -> Existing Projects into Workspace-O1为这两种方法提供相同的性能。

-O2减慢了矢量版本的速度。

为什么会这样,您需要查看反汇编或-Ox级别的详细信息。它与-Oxset.find的算法属性无关。

关于数据的位置。 binary_search和set :: find对于合理的实现具有完全相同的数据位置。该集合甚至可能以从左到右的方式读取数据。