【发布时间】:2011-09-16 09:25:01
【问题描述】:
我刚刚尝试在 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,但我假设排序只是单线程)
编辑:现在你可以称我为笨蛋,但是当我试图重现我用于测量的代码时(我已经删除了原来的代码)我无法重现结果 - 现在是数组版本大约需要 1915 +- 5ms(在 32 次运行中测量)。我只能发誓我已经(手动)对 10 次测量进行了 3 次测试,结果相似,但这并不是一个严格的证明。
原始代码中可能存在一些错误,后台进程似乎不太可能,因为我已经交替测量向量和数组版本并且向量结果保持不变并且没有用户登录。
请将此问题视为已结束。感谢您的努力。
【问题讨论】:
-
您运行了多少次测试?一次完全不准确。
-
您应该提供您确实遵循的确切测试协议。例如,如果您对每个测试执行的次数不超过一次,或者如果您在同一执行中执行了两个测试,则 test 不相关。
-
在我的
i7 920 @ 2.67 GHz和gcc 4.5.2上,我得到770 - 780 ms向量和630 - 650 ms数组。您使用了哪些优化选项? (我用-march=native -O3,数组和向量包含相同的16000000对随机数) -
@Konrad 鉴于他没有向我们展示他实际测量的任何代码,谁知道呢?但差异并不是很大(他也没有说他是如何测量的)。
-
你在两个测试中使用相同的输入数据吗?
标签: c++ performance stl vector