【发布时间】:2014-07-20 16:53:10
【问题描述】:
我想为一些函数的执行计时,我给自己写了一个助手:
using namespace std;
template<int N = 1, class Fun, class... Args>
void timeExec(string name, Fun fun, Args... args) {
auto start = chrono::steady_clock::now();
for(int i = 0; i < N; ++i) {
fun(args...);
}
auto end = chrono::steady_clock::now();
auto diff = end - start;
cout << name << ": "<< chrono::duration<double, milli>(diff).count() << " ms. << endl;
}
我认为以这种方式为成员函数计时,我必须使用 bind 或 lambda,我想看看哪个对性能的影响较小,所以我这样做了:
const int TIMES = 10000;
timeExec<TIMES>("Bind evaluation", bind(&decltype(result)::eval, &result));
timeExec<1>("Lambda evaluation", [&]() {
for(int i = 0; i < TIMES; ++i) {
result.eval();
}
});
结果是:
Bind evaluation: 0.355158 ms.
Lambda evaluation: 0.014414 ms.
我不知道内部原理,但我认为 lambda 不可能比 bind 更好。我能想到的唯一合理的解释是编译器优化了 lambda 循环中的后续函数评估。
你会怎么解释?
【问题讨论】:
-
可以内联 lambda 主体。绑定表达式可能不可内联。检查机器代码以确保。也可以试试
Fun && fun。 -
还有一点:我是在学习表情模板的时候想到的。我有一个可以在运行时或编译时评估的计算图。所描述的行为发生在编译时评估的情况下,而不是运行时。
-
您确实需要检查程序集以了解发生了什么。
-
这不就是
timeExec<TIMES>vs.timeExec<1>吗? -
这绝对不是苹果对苹果的比较。我很好奇如果你这样做会发生什么
timeExec<TIMES>("Lambda evaluation", [&] { result.eval(); })
标签: c++ caching c++11 lambda bind