std::矢量比普通数组快
std::vector faster than plain array?
我刚刚尝试在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
编译代码?
如果没有,那就去做吧。所有其他的基准测试结果都毫无意义,尤其是对于模板代码。
你做了很多次测试吗?
这样做是为了防止诸如中断和/或缓存之类的事情对结果产生很大影响。
不要将浮点比较或算术用于基准测试。结果在很大程度上取决于编译器、平台、编译器选项等。
你的测试数据是如何创建的?
大多数排序算法所需的时间根据输入数据的排序而变化。
你用哪种方法测量时间?时钟周期?计时器?
无论如何,编写提供可靠结果的基准测试并不像最初看起来那么容易。不要使用基准测试来确定解决问题的正确代码。
- std::向量与传递值的动态数组
- std::vector的包装器,使数组的结构看起来像结构的数组
- 初始化具有非默认构造函数的std::数组项的更好方法
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 将 int 数组转换为 std::vector<int*>
- 输入std::数组时出现问题
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 为什么std::vector比数组慢
- C++如何生成std::数组列表
- 捕获lambda中的std::数组
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 当 std::move 与 C 样式数组或不移动对象时会发生什么
- std::数组边界检查如何工作?
- 通过unique_ptr访问std::数组
- 我正在使用 std::bitset 并尝试创建两个大小为 100,000,000,000 的数组 std::bitset
- 对象的数组-STD ::数组 - 构造函数初始化问题
- 标准::数组<std::array<T、N2>、N> 数据成员上的括号运算符重载
- 从未来对象数组std::vector中检索值
- 如何将动态数组(std::vector)传递给odbc函数SQLBindParameter