std::矢量比普通数组快

std::vector faster than plain array?

本文关键字:数组 std      更新时间:2023-10-16

我刚刚尝试在std::vector<std::pair<float, unsigned int>>(使用push_back操作填充)和普通std::pair<float, unsigned int>> *阵列(使用new分配,然后逐个填充)上对std::sort进行基准测试。compare函数只是比较了对的浮点部分。

令人惊讶的是,当在16M值上使用时,在std::vector上只花了大约1940毫秒,但在数组上却花了大约2190毫秒。有人能解释向量如何更快吗?这是由于缓存,还是仅仅是std::sort的数组版本实现得不好?

gcc (GCC) 4.4.5 20110214 (Red Hat 4.4.5-6)

Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz - cache size 8192 KB(计算机有两个四核CPU,但我认为这类CPU只有单线程)

编辑:现在你可以称我为笨蛋,但当我试图重现我用于测量的代码时(我已经删除了原始代码),我无法重现结果-现在阵列版本大约需要1915+/-5ms(32次运行测量)。我只能发誓,我已经(手动)对10次测量进行了三次测试,结果相似,但这不是一个严格的证明。

原始代码中可能有一些错误,后台处理似乎不可行,因为我交替测量了矢量和数组版本,矢量结果保持不变,没有用户登录

请将此问题视为已关闭。谢谢你的努力。

std::vector<std::pair<float, unsigned int>>(填充有推回操作)

这连续存储所有数据,因此内存局部性是非常好的

std::pair<float, unsigned int>> *阵列(使用新的分配,然后逐个填充)

这会将数据分散到内存中。

您在vector和一个简单数组之间设置了一个非常不公平的比较。数组情况中涉及的额外间接性会造成伤害,缺乏局部性会扼杀缓存性能。我很惊讶您没有看到在支持连续存储方面取得更大的胜利。

他们将使用相同版本的sort。这很可能是随机的CPU效应,比如缓存或线程上下文切换。

您是否使用-O3编译代码?

如果没有,那就去做吧。所有其他的基准测试结果都毫无意义,尤其是对于模板代码。

你做了很多次测试吗?

这样做是为了防止诸如中断和/或缓存之类的事情对结果产生很大影响。

不要将浮点比较或算术用于基准测试。结果在很大程度上取决于编译器、平台、编译器选项等。

你的测试数据是如何创建的?

大多数排序算法所需的时间根据输入数据的排序而变化。

你用哪种方法测量时间?时钟周期?计时器?

无论如何,编写提供可靠结果的基准测试并不像最初看起来那么容易。不要使用基准测试来确定解决问题的正确代码。