为什么对排序向量进行的二进制搜索比STD :: SET FIND慢

Why is a binary search over a sorted vector is slower than std::set find?

本文关键字:STD SET FIND 搜索 二进制 排序 向量 为什么      更新时间:2023-10-16

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

http://rextester.com/mnqzs47293

我在我的计算机上获得了类似的结果(使用相同版本的MSVC),向量中的查找比std :: Set。

慢。

由于数据的局部性更好(更友好),我希望分类的向量版本会更快。在更糟糕的情况下,我希望它们会相似,因为它们都执行二进制搜索,但是我不明白为什么STD :: SET比分类的向量版本要快得多。

非常感谢

编辑:对不起,我粘贴了错误的链接(我修改了代码,但忘记复制链接)旧代码使用unordered_set,此代码使用集合,问题仍然相同:为什么二进制搜索排序的矢量比集合较慢?我注意到,如果元素数量足够大,那么排序的向量速度更快,但是我仍然不明白为什么该集合可以在任何数量的元素上胜过分类的向量。

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

unordered_set是一个哈希表。那里的搜索是不是二进制搜索。在那里,搜索性能取决于哈希功能和负载因子。

对于更新的问题:

-O1-O2给出了两种方法相同的性能。

-Ox减慢了向量版本。

为什么是,您需要查看拆卸或-Ox级别的详细信息。它与set.findlower_bound/binary_search的算法属性无关。

关于数据的局部性。binary_search和set :: find具有与数据的合理实现相同的合理实现。该集合甚至可能以左右读取的数据获胜。