在这里,您可以看到代码,运行它并查看时间。
http://rextester.com/MNQZS47293
我在我的机器上得到了类似的结果(使用相同版本的MSVC),向量中的查找比std :: set中的查找慢。
由于数据的更好的局部性(更多缓存友好),我希望排序的矢量版本更快。 在更糟糕的情况下,我希望它们是相似的,因为它们都执行二进制搜索,但我无法理解为什么std :: set比排序的矢量版本快得多。
非常感谢
编辑:抱歉,我粘贴了错误的链接(我修改了代码但忘了复制链接)旧代码使用的是unordered_set,这段代码使用了一个集合,问题仍然是一样的:为什么是二进制文件搜索比一组慢的排序向量?我注意到如果元素的数量足够大,那么排序后的矢量会更快,但我仍然无法理解为什么该集合可以胜过任意数量元素的排序矢量。答案 0 :(得分:2)
链接代码似乎使用unordered_set
,而不是set
。
unordered_set
是一个哈希表。搜索是不二进制搜索。在那里,搜索性能取决于散列函数和负载因子。
答案 1 :(得分:1)
更新问题:
File -> Import -> General -> Existing Projects into Workspace
和-O1
为这两种方法提供相同的性能。
-O2
减慢了矢量版本的速度。
为什么会这样,您需要查看反汇编或-Ox
级别的详细信息。它与-Ox
和set.find
的算法属性无关。
关于数据的位置。 binary_search和set :: find对于合理的实现具有完全相同的数据位置。该集合甚至可能以从左到右的方式读取数据。