C++ clang array 比 clang vector 和 gcc vector 和 array 快得多
C++ clang array much faster than clang vector and both gcc vector and array
下面的代码显示了我的测试用例。我用 clang++ --std=c++11 -O2 和 g++ --std=c++11 -O2.
编译
long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
ary[i] = i;
std::vector<long long> vec(100000000, 0);
for (long long i = 0; i < 100000000; ++i)
vec[i] = i;
对于这两个,我只测试了初始化,然后是初始化和 for 循环。结果如下:
海湾合作委员会:
- 仅数组初始化:0.182s
- 数组初始化和for循环:0.250s
- 仅向量初始化:0.169s
- 向量初始化和for循环:0.252
叮当声:
- 仅数组初始化:0.004s
- 数组初始化和for循环:0.004s
- 仅向量初始化:0.150
- 向量初始化和for循环:0.240s
gcc 结果与向量与数组一样快的普遍看法相吻合。此外,vector 的 clang 和 gcc 结果非常一致。然而,clang 结果是荒谬的,阵列的执行速度要快得多。有人知道这是为什么吗?
25 倍的加速表示您的代码已优化。由于您的代码没有任何可见的内容,因此有资格被删除。您的基准无效。
此处的区别在于 clang
和 gcc
如何处理优化对 new
的调用。以下代码:
long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
ary[i] = i;
clang
将在 -O2
优化级别对其进行优化(see it live):
xorl %eax, %eax
retq
而 gcc
不会 see it live:
movl 0000000, %edi
call operator new[](unsigned long)
leaq 800000000(%rax), %rcx
movq %rax, %rdx
.L2:
movq [=12=], (%rdx)
addq , %rdx
cmpq %rcx, %rdx
jne .L2
xorl %edx, %edx
问题是valid optimization or not? One could argue that by the as-if rule this is not a valid optimization since new
can result in observable behavior。
提案 N3664: Clarifying Memory Allocation but clang
has includes this optimization from before this period, see this answer.
对 C++14 进行了有效优化
下面的代码显示了我的测试用例。我用 clang++ --std=c++11 -O2 和 g++ --std=c++11 -O2.
编译long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
ary[i] = i;
std::vector<long long> vec(100000000, 0);
for (long long i = 0; i < 100000000; ++i)
vec[i] = i;
对于这两个,我只测试了初始化,然后是初始化和 for 循环。结果如下:
海湾合作委员会:
- 仅数组初始化:0.182s
- 数组初始化和for循环:0.250s
- 仅向量初始化:0.169s
- 向量初始化和for循环:0.252
叮当声:
- 仅数组初始化:0.004s
- 数组初始化和for循环:0.004s
- 仅向量初始化:0.150
- 向量初始化和for循环:0.240s
gcc 结果与向量与数组一样快的普遍看法相吻合。此外,vector 的 clang 和 gcc 结果非常一致。然而,clang 结果是荒谬的,阵列的执行速度要快得多。有人知道这是为什么吗?
25 倍的加速表示您的代码已优化。由于您的代码没有任何可见的内容,因此有资格被删除。您的基准无效。
此处的区别在于 clang
和 gcc
如何处理优化对 new
的调用。以下代码:
long long *ary = new long long[100000000]();
for (long long i = 0; i < 100000000; ++i)
ary[i] = i;
clang
将在 -O2
优化级别对其进行优化(see it live):
xorl %eax, %eax
retq
而 gcc
不会 see it live:
movl 0000000, %edi
call operator new[](unsigned long)
leaq 800000000(%rax), %rcx
movq %rax, %rdx
.L2:
movq [=12=], (%rdx)
addq , %rdx
cmpq %rcx, %rdx
jne .L2
xorl %edx, %edx
问题是valid optimization or not? One could argue that by the as-if rule this is not a valid optimization since new
can result in observable behavior。
提案 N3664: Clarifying Memory Allocation but clang
has includes this optimization from before this period, see this answer.