Geschwindigkeit von gebundenem Lambda (via std :: function) vs operator () von 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; }
};

In Version eins, wir

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

Die Alternative ist

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

n beiden Fällen haben wir eine einfache Iteration

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

Ich sehe einen Geschwindigkeitsunterschied von 3: 1, wobei das gebundene Lambda langsamer ist. Der Funktor ist fast so schnell wie das Speichern von ganzzahligen Paaren und das Hardcodieren der Tests. Offensichtlich ist die Hardcodierung für den Produktionscode nicht so nützlich, da nicht nur zwischen den einzelnen Funktionen eine Reihe von Funktionen ausgeführt werden. Ich kann jedoch entweder mit vielen Funktoren oder mit vielen Lambdas fahren. Letzteres ist weniger Codezeilen und sieht sauberer aus, aber ich glaube nicht, dass ich mir diesen Geschwindigkeitsunterschied leisten kann. Dieser Code befindet sich in einer kritischen Schleife.

Ich bin auf der Suche nach Verbesserungsvorschlägen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage