std::vector 明显比原生数组慢吗?
你可能听说过 std::vector 本质上是实现为一个数组,这意味着它们的性能应该具有可比性。但是,您最近的测试表明情况并非如此, std::vector 表现出显着的性能损失。本文旨在澄清 std::vector 是否确实比原生数组慢很多。
性能分析
提供的测试代码测量了初始化一个大数组所需的时间。使用三种不同方法的 Pixel 对象数组:带有 resize() 的 std::vector、带有 push_back() 的 std::vector 以及用 malloc() 分配的普通数组。结果表明,带有 resize() 的 std::vector 比普通数组慢大约 4 倍,而带有 push_back() 的 std::vector 甚至更慢。
但是,经过仔细检查,情况变得很明显性能差异源于测试代码对向量进行两次迭代这一事实。第一次迭代初始化对象,第二次迭代只是读取它们。这样做是为了方便与只能初始化一次的普通数组进行公平比较。
修订测试
准确比较 std::vector 的性能对于原生数组,测试代码被修改为仅初始化向量一次:
std::vector<Pixel> pixels(dimensions * dimensions, Pixel(255, 0, 0));
通过此修改,之间的性能差距std::vector 和普通数组变得可以忽略不计:
g++ -O3 Time.cpp -I <MyBoost> ./a.out UseVector completed in 2.216 seconds
结论
根据修改后的测试结果,std::vector 的性能与与本机数组相同。在初始测试中观察到的明显缓慢是由于 std::vector 使用的初始化方法效率低下造成的。正确初始化后,与本机数组相比,std::vector 表现出最小的性能开销。
应该注意的是,所提供的测试结果特定于 Pixel 类和所采用的特定初始化模式。对于其他类和初始化场景,性能可能会有所不同。
以上是`std::vector` 真的比原生数组慢吗?的详细内容。更多信息请关注PHP中文网其他相关文章!