编辑注:
启用优化后仅计时循环的后续问题:
为什么迭代 std::vector 比迭代 std::array 更快?
在这里,我们可以看到惰性分配页面错误对于读取未初始化 BSS 内存与动态分配的+写入内存的影响,它们在定时循环之外进行了初始化。
我尝试过对这段代码进行性能分析:
启用优化后仅计时循环的后续问题:
为什么迭代 std::vector 比迭代 std::array 更快?
在这里,我们可以看到惰性分配页面错误对于读取未初始化 BSS 内存与动态分配的+写入内存的影响,它们在定时循环之外进行了初始化。
我尝试过对这段代码进行性能分析:
#include <vector>
#include <array>
#include <stdio.h>
using namespace std;
constexpr int n = 400'000'000;
//vector<int> v(n);
array<int, n> v;
int main()
{
int res = 0;
for(int x : v)
res += x;
printf("%d\n", res);
}
在我的电脑上,array
版本比 vector
快。
在这种情况下,内存分配是不相关的,因为它只发生一次。
$ g++ arrVsVec.cpp -O3
$ time ./a.out
0
real 0m0,445s
user 0m0,203s
sys 0m0,238s
$ g++ arrVsVec.cpp -O3
$ time ./a.out
0
real 0m0,749s
user 0m0,273s
sys 0m0,476s
我发现对于std::vector
而言,反汇编要复杂得多:https://godbolt.org/z/111L5G
std::array
是免费的(需要零时间)。 - Galikg++ -O3 arrVsVec.cpp
进行编译。非优化的“基准测试”完全没有价值。 - M.Mreserve
没有任何意义,因为我已经一次性分配了所有的内存。 - tuket