#include <iostream>
#include <ctime>
#define TIME(t) {std::cout << ((double)(clock() - (t)) / CLOCKS_PER_SEC);}
volatile long int limit = 10000000000;
void l2(int& a) {a++;}
void f(int& a)
{
auto l1 = [&a]()
{
a++;
};
clock_t clk = clock();
for(int i=0;i<limit;i++)
{
l1();
}
TIME(clk) // 4.07 s
a=5;
clk = clock();
for(int i=0;i<limit;i++)
{
l2(a);
}
TIME(clk) // 4.32 s
}
int main()
{
int a = 5;
f(a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么更快地调用lambda函数?
使用gcc 4.8和O3
Lambda循环反汇编:(在C++ 11模式下使用godbolt gcc 4.8.2 -O3)
movq limit(%rip), %rax
testq %rax, %rax
jle .L7
movl (%rbx), %eax
movl $1, %edx
.L8:
movq limit(%rip), %rcx
movq %rdx, %rsi
leal (%rax,%rdx), %edi
addq $1, %rdx
cmpq %rcx, %rsi
jl .L8
movl %edi, (%rbx)
Run Code Online (Sandbox Code Playgroud)
函数调用循环反汇编:
movq limit(%rip), %rax
testq %rax, %rax
jle .L5
movl (%rbx), %eax
movl $1, %edx
.L10:
movq limit(%rip), %rcx
movq %rdx, %rsi
leal (%rax,%rdx), %edi
addq $1, %rdx
cmpq %rcx, %rsi
jl .L10
movl %edi, (%rbx)
Run Code Online (Sandbox Code Playgroud)
这两个循环编译成相同的代码.
任何差异都是由于您执行操作的顺序或随机机会.
通常,lambdas更容易内联,因为操作()是由变量的类型定义的,而不是值.传播值并使用它们进行优化比使用类型进行更加困难.
典型的例子是使用qsortVS std::sort.
| 归档时间: |
|
| 查看次数: |
248 次 |
| 最近记录: |