Velocidade do lambda ligado (via std :: function) vs operator () do functor struct
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; }
};
Na versão um, nós
std::vector<std::function<bool (int)>> lamvals;
// get parameters and for each
lamvals.emplace_back(std::bind(lam, a, std::placeholders::_1, b));
A alternativa é
std::vector<functor> lamvals;
// get parameters and for each
lamvals.emplace_back(functor{a, b});
Nos dois casos, temos uma iteração simples
return std::any_of(lamvals.cbegin(), lamvals.cend(),
[n](const decltype(lamvals)::value_type & t){return t(n);});
Estou vendo uma diferença de velocidade de 3: 1, com o lambda vinculado mais lento. O functor é quase tão rápido quanto armazenar pares inteiros e codificar os testes. Obviamente, a codificação não é tão útil para o código de produção, porque haverá várias funções em jogo, não apenas entre elas. No entanto, posso usar muitos functores ou muitas lambdas. O último é menos linhas de código e parece mais limpo, mas acho que não posso pagar essa diferença de velocidade; esse código está em um loop crítico.
Estou à procura de sugestões de aceleração.