为什么c++ lambda在多次调用时比普通函数慢
Why C++ lambda is slower than ordinary function when called multiple times?
我只是试图比较c++ 11中lambda表达式的性能,所以我做了测试-计算double
值向量中的元素和。下面是实现:
#include <vector>
#include <algorithm>
#include <iostream>
#include <ctime>
#define LOG(x) { std::cout << #x << " = " << (x) << "n"; }
#define TIME(t) { std::cout << ((double)(clock() - (t)) / CLOCKS_PER_SEC) << " sn"; }
double sum(const std::vector<double>& v)
{
double s = 0.0;
for (auto i = v.cbegin(); i != v.cend(); ++i)
s += *i;
return s;
}
int main()
{
const size_t MAX = 1; // number of tests
const size_t SIZE = 100000000; // length of the vector
std::vector<double> v(SIZE, 1.0);
double out;
clock_t clk;
std::cout << "iteratorn";
clk = clock();
out = 0.0;
for (size_t i = 0; i < MAX; ++i)
out += sum(v);
TIME(clk)
LOG(out)
std::cout << "nlambdan";
clk = clock();
out = 0.0;
for (size_t i = 0; i < MAX; ++i)
std::for_each(v.cbegin(), v.cend(), [&](double d) { out += d; });
TIME(clk)
LOG(out)
return 0;
}
下面是这个程序的结果(在VS2010 SP1中编译,在Release模式下):
<>之前迭代器0.32秒Out = 1e+008λ0.326秒Out = 1e+008之前可以看出,在性能上几乎没有差别。但是,如果我将MAX
的值设为10(这意味着将执行10次而不是1次求和),结果就不同了:
测试lambda表达式花费了大约10倍的时间。为什么?我认为这可能是由于这样的事实,即在每次迭代新的lambda被创建,但当我尝试这个:
out = 0.0;
auto f = [&](double d) { out += d; };
for (size_t i = 0; i < MAX; ++i)
std::for_each(v.cbegin(), v.cend(), f);
结果没有改变。有人能给我解释一下这种行为吗?
事实证明,这不是lambda表达式的问题,只是编译器通过缓存sum()
函数的结果优化了第一种情况下的外部循环。
将第一个大小写改为如下形式:
out = 0.0;
for (size_t i = 0; i < MAX; ++i)
{
out += sum(v);
v[i] = 1.0; // this adds O(1) time and prevents caching
}
在这两种情况下,时间大致相等,lambda是首选。
相关文章:
- 函数调用中参数的顺序重要吗
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 变量没有改变?通过向量的函数调用
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 模板函数调用
- 获取从C++中同一类中的构造函数调用的方法返回的值
- 析构函数调用
- 成员函数调用和C++对象模型
- 使用共享指针的函数调用,其对象应为 const
- C++:编译时检查匹配的函数调用对?
- 函数调用C++中的参数太少
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 返回指向对象的指针的函数调用是否为 prvalue?
- C++ 如何重载 [] 运算符并进行函数调用
- 代码的效率. 转到和函数调用
- 是同一作用域的函数部分中的函数调用
- 如何封装一个函数,以便它只能由同一类中的一个其他函数调用?
- 类型擦除的std::function与虚拟函数调用的开销