std :: vector比普通数组更快?

时间:2011-06-16 13:31:04

标签: c++ performance stl vector

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

令人惊讶的是,当在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,但我认为排序只是单线程)

编辑:现在你可以叫我dumbass,但是当我试图重现我用于测量的代码时(我已经删除了原来的代码)我无法重现结果 - 现在数组版本大约需要1915 + - 5ms(在32次运行中测量)。我只能发誓我已经对10次测量进行了三次测试(手动)并得到了类似的结果,但这并不是一个严格的证明。

原始代码中可能存在一些错误,后台进程似乎无法进行,因为我已经交替测量了矢量和数组版本,并且矢量结果保持并且没有用户登录。

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

3 个答案:

答案 0 :(得分:12)

  

std::vector<std::pair<float, unsigned int>>(填充了push_back操作)

这可以保存所有数据,因此内存位置非常好

  

std::pair<float, unsigned int>> *数组(使用new分配然后逐个填充)

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

您在vector和简单数组之间建立了非常不公平的比较。数组中涉及的额外间接性会受到损害,缺少局部性会破坏缓存性能。我很惊讶你没有看到更大的胜利支持连续存储。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

你多次参加考试了吗?

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

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

您的testdata是如何创建的?

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

您使用了哪种测量时间的方法?时钟周期?计时器?

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