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.

questionAnswers(1)

yourAnswerToTheQuestion