我刚刚尝试比较了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) << " s\n"; }
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 << "iterator\n";
clk = clock();
out = 0.0;
for (size_t i = 0; i < MAX; ++i)
out += sum(v);
TIME(clk)
LOG(out)
std::cout << "\nlambda\n";
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秒 输出 = 1e+008 lambda表达式 0.326秒 输出 = 1e+008
可以看出,性能几乎没有差别。然而,如果我将MAX
的值设为10(这意味着将执行10次求和而不是一次),结果就会有所不同:
迭代器 0.287秒 输出 = 1e+009 lambda表达式 2.84秒 输出 = 1e+009
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);
结果没有改变。有人能解释一下这种行为吗?
foreach
? - Sergey Kalinichenko