Velocidad de lambda enlazada (vía std :: function) vs operator () de 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; }
};

En la versión uno, nosotros

std::vector<std::function<bool (int)>> lamvals;
// get parameters and for each
lamvals.emplace_back(std::bind(lam, a, std::placeholders::_1, b));

La alternativa es

std::vector<functor> lamvals;
// get parameters and for each
lamvals.emplace_back(functor{a, b});

En ambos casos tenemos una iteración simple

    return std::any_of(lamvals.cbegin(), lamvals.cend(),
            [n](const decltype(lamvals)::value_type & t){return t(n);});

Estoy viendo una diferencia de velocidad de 3: 1, con el lambda encuadernado más lento. El functor es casi tan rápido como almacenar pares enteros y codificar las pruebas. Obviamente, el hardcoding no es tan útil para el código de producción, porque habrá varias funciones en juego, no solo entre ellas. Sin embargo, puedo ir con muchos functors o muchas lambdas. Este último tiene menos líneas de código y parece más limpio, pero no creo que pueda permitirme esa diferencia de velocidad; Este código está en un ciclo crítico.

Estoy buscando sugerencias de aceleración.

Respuestas a la pregunta(1)

Su respuesta a la pregunta