auto lam = [](int a, int b, int c) { return a < b && b < c; };
struct functor {
int a;
int b;
bool operator()(int n) const { return a < n && n < b; }
};
在第一版中,我们
std::vector<std::function<bool (int)>> lamvals;
// get parameters and for each
lamvals.emplace_back(std::bind(lam, a, std::placeholders::_1, b));
替代方案是
std::vector<functor> lamvals;
// get parameters and for each
lamvals.emplace_back(functor{a, b});
在这两种情况下,我们都有一个简单的迭代
return std::any_of(lamvals.cbegin(), lamvals.cend(),
[n](const decltype(lamvals)::value_type & t){return t(n);});
我看到速度差为3:1,绑定的lambda更慢。仿函数几乎与存储整数对和硬编码测试一样快。显然,硬编码对于生产代码没那么有用,因为会有几个功能在起作用,而不仅仅是在它们之间。但是,我可以选择许多仿函数或许多lambdas。后者是更少的代码行,看起来更干净,但我认为我无法承受这种速度差异;此代码处于关键循环中。
我正在寻找加速建议。