std :: function vs template

Dank C ++ 11 erhielten wir diestd::function Familie von Functor Wrappern. Leider höre ich immer nur schlechte Dinge über diese neuen Ergänzungen. Am beliebtesten ist, dass sie schrecklich langsam sind. Ich habe es getestet und sie saugen wirklich im Vergleich zu Vorlagen.

#include <iostream>
#include <functional>
#include <string>
#include <chrono>

template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }

float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; }

int main() {
    using namespace std::chrono;

    const auto tp1 = system_clock::now();
    for (int i = 0; i < 1e8; ++i) {
        calc1([](float arg){ return arg * 0.5f; });
    }
    const auto tp2 = high_resolution_clock::now();

    const auto d = duration_cast<milliseconds>(tp2 - tp1);  
    std::cout << d.count() << std::endl;
    return 0;
}

111 ms vs 1241 ms. Ich nehme an, das liegt daran, dass Templates währenddessen schön inline gesetzt werden könnenfunctions decken die Interna über virtuelle Anrufe ab.

Vorlagen haben offensichtlich Probleme, wie ich sie sehe:

Sie müssen als Header bereitgestellt werden, was Sie möglicherweise nicht möchten, wenn Sie Ihre Bibliothek als geschlossenen Code freigeben.Sie können die Kompilierungszeit wesentlich verlängern, es sei dennextern template-wie Politik eingeführt wird,Es gibt keine (zumindest mir bekannte) saubere Art, Anforderungen (Konzepte, irgendjemandes?) einer Vorlage darzustellen, abgesehen von einem Kommentar, der beschreibt, welche Art von Funktor erwartet wird.

Kann ich das also annehmenfunctions kann als verwendet werdende facto Standard der Übergabe functors, und an Orten, an denen hohe Leistung erwartet wird, sollten Vorlagen verwendet werden?

Bearbeiten:

Mein Compiler ist das Visual Studio 2012ohne CTP.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage