gpt4 book ai didi

c++ - iota、generate 和手动循环是否都执行相同的操作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:18:44 25 4
gpt4 key购买 nike

这三种填充 vector 的方式之间是否存在性能差异?

#include <vector>
#include <numeric>
#include <algorithm>
#include <iterator>

int main()
{
std::vector<int> v(10);
std::iota(v.begin(), v.end(), 0);

std::vector<int> v2(10);
int i = 0;
std::generate(v2.begin(), v2.end(), [&i](){return i++; });

std::vector<int> v3(10);
i = 0;
for (auto& j : v3)
{
j = i++;
}

return 0;
}

我知道它们都产生相同的结果,我只想知道较大的 vector 是否存在速度差异。 不同类型的答案会有所不同吗?

最佳答案

我们可以查看输出程序集(我使用了 gcc.godbolt.org,gcc -03,以及您的代码):

1) 第一个版本,带有 std::iota :

main:
sub rsp, 8
mov edi, 40
call operator new(unsigned long)
mov DWORD PTR [rax], 0
mov DWORD PTR [rax+4], 1
mov rdi, rax
mov DWORD PTR [rax+8], 2
mov DWORD PTR [rax+12], 3
mov DWORD PTR [rax+16], 4
mov DWORD PTR [rax+20], 5
mov DWORD PTR [rax+24], 6
mov DWORD PTR [rax+28], 7
mov DWORD PTR [rax+32], 8
mov DWORD PTR [rax+36], 9
call operator delete(void*)
xor eax, eax
add rsp, 8
ret

2) 带有 std::generate 和 Lambda 的版本:

main:
sub rsp, 8
mov edi, 40
call operator new(unsigned long)
mov DWORD PTR [rax], 0
mov DWORD PTR [rax+4], 1
mov rdi, rax
mov DWORD PTR [rax+8], 2
mov DWORD PTR [rax+12], 3
mov DWORD PTR [rax+16], 4
mov DWORD PTR [rax+20], 5
mov DWORD PTR [rax+24], 6
mov DWORD PTR [rax+28], 7
mov DWORD PTR [rax+32], 8
mov DWORD PTR [rax+36], 9
call operator delete(void*)
xor eax, eax
add rsp, 8
ret

3) 最后一个版本,手写循环:

main:
sub rsp, 8
mov edi, 40
call operator new(unsigned long)
mov DWORD PTR [rax], 0
mov DWORD PTR [rax+4], 1
mov rdi, rax
mov DWORD PTR [rax+8], 2
mov DWORD PTR [rax+12], 3
mov DWORD PTR [rax+16], 4
mov DWORD PTR [rax+20], 5
mov DWORD PTR [rax+24], 6
mov DWORD PTR [rax+28], 7
mov DWORD PTR [rax+32], 8
mov DWORD PTR [rax+36], 9
call operator delete(void*)
xor eax, eax
add rsp, 8
ret

结论:

正如预期的那样,所有这三个都生成了相同的程序集(全部展开),使用了一个不错的编译器,启用了优化。

所以不,没有性能差异。


注意:

我做了比较程序集的测试, vector 大到没有展开的循环(我不知道 GCC 启发式方法,但它开始时大小 >~ 15)。

在那种情况下,对于所有 3 种情况,程序集仍然相同,我不会在此处复制输出,因为它不会带来太多答案,但问题是编译器是真的非常擅长优化这种代码。

关于c++ - iota、generate 和手动循环是否都执行相同的操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25475677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com