#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;
}
为什么更快地调用lambda函数?
使用gcc 4.8和O3
答案 0 :(得分:8)
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)
函数调用循环反汇编:
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)
这两个循环编译成相同的代码。
任何差异都是由于您执行操作的顺序或随机机会。
通常,lambdas更容易内联,因为()
的操作是由变量的类型定义的,而不是值。传播值并使用它们进行优化比使用类型进行优化要困难得多。
经典示例使用qsort
vs std::sort
。
答案 1 :(得分:1)
从概念上讲,该函数可以处理其他变量,但lambda仅适用于a
显然,你拥有的灵活性越多,你就可以支付得越多,就像在这种情况下一样
在这里,发生的事情是在每次调用时将参数传递给函数比不这样做更昂贵,并且编译器无法对此进行优化,因此存在差异。