繁体   English   中英

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

[英]std::vector faster than plain array?

我刚刚尝试在std::vector<std::pair<float, unsigned int>> (使用push_back操作填充)和纯std::pair<float, unsigned int>> *数组上对std::sort进行基准测试使用new分配,然后一一填写)。 比较功能只是比较了两对浮点部分。

出乎意料的是,当在std :: vector上使用16M值时,仅花费了约1940 ms,而在阵列上则花费了约2190 ms。 有人可以解释向量如何更快吗? 是由于缓存,还是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个测量进行了三次测试(手动),并且得到了相似的结果,但这并不是严格的证明。

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

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

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

这会连续存储所有数据,因此内存位置非常好

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

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

您已经在vector和简单数组之间建立了非常不公平的比较。 数组情况中涉及的额外间接将受到伤害,缺乏局部性将导致缓存性能下降。 我很惊讶您看不到支持连续存储的更大胜利。

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

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

如果不是,请执行此操作。 所有其他基准测试结果都是毫无意义的,尤其是对于模板代码而言。

您是否进行了多次测试?

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

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

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

大多数排序算法所需的时间取决于输入数据的排序。

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

无论如何,编写提供可靠结果的基准并不像乍看起来那样容易。 不要使用基准来确定适合您问题的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM