c++ - std::vector 比普通数组快吗?

标签 c++ performance stl vector

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

令人惊讶的是,当用于 16M 值时,在 std::vector 上只需要大约 1940 毫秒,但在数组上大约需要 2190 毫秒。谁能解释一下 vector 如何更快?是因为缓存,还是只是数组版本的 std::sort 实现不好?

gcc (GCC) 4.4.5 20110214(红帽 4.4.5-6)

Intel(R) Core(TM) i7 CPU 870 @ 2.93GHz - 缓存大小 8192 KB(计算机有两个四核 CPU,但我假设排序只是单线程)

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

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

请将此问题视为已结束。感谢您的努力。

最佳答案

std::vector<std::pair<float, unsigned int>> (filled with push_back operation)

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

std::pair<float, unsigned int>> * array (allocated using new and then filled one by one)

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

您在 vector 和一个简单数组之间进行了非常不公平的比较。数组案例中涉及的额外间接性会受到伤害,缺乏局部性会降低缓存性能。我很惊讶你没有看到有利于连续存储的更大胜利。

关于c++ - std::vector 比普通数组快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6372685/

相关文章:

c++ - 使用模板链表类复制构造函数错误

c++ - 为什么不能在类声明(不完整类型)中使用 "is_base_of"?

javascript - Angular ng-change 与 ng-model 性能对比

c++ - 如何获得 std::set 的相对索引?

c++ - std::map插入线程安全吗?

c++ - 比较两个不同列表的内容

javascript - 转换 tfjs 模型以在 C++ 中的 Tensorflow 中使用

php - 在每次页面加载时从数据库序列化数据读/写不好吗?

c# - 使用泛型的 C# 方法多态性的性能

用于连接 std::vector 和 std::array 类型的 C++ 模板函数