Wie hoch ist der Leistungsaufwand von std :: function?
Hörte ich auf ein forum mit std::function<>
verursacht Leistungsabfall. Ist es wahr? Wenn das stimmt, ist es eine große Leistung-drop?
Kommentar zu dem Problem - Öffnen
Welchen compiler verwendest du?
Bewirkt einen Leistungsabfall im Vergleich zu was alternative?
Sie haben viel mehr bestimmten, als, dass, user408141.
Wirklich, das ist so eine schlechte Frage.
Ich bearbeitet den Titel ein bisschen aussagekräftiger. "Im Vergleich zu was" - persumable im Vergleich zu einem handgerollt weniger generische Lösung...
InformationsquelleAutor der Frage | 2011-02-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Finden Sie Informationen von der boost-Referenz-Material: Wie viel Aufwand kostet ein Anruf über boost::function entstehen? und Leistung
Diese bestimmt nicht "ja oder Nein", um die boost-Funktion. Der Leistungsabfall kann gut sein, akzeptabel ist, da das Programm den Anforderungen. Mehr als oft nicht, die Teile eines Programmes, die nicht performance-kritisch. Und selbst dann ist es noch akzeptabel sein können. Dies ist nur etwas, das man selbst bestimmen kann.
Als der standard-library-version, die der standard definiert nur eine Schnittstelle. Es ist völlig bis zu den einzelnen Implementierungen, damit es funktioniert. Ich nehme an eine ähnliche Umsetzung zu-boost-Funktion verwendet werden würde.
InformationsquelleAutor der Antwort UncleBens
Es gibt in der Tat performance-Probleme mit
std:function
muss berücksichtigt werden, Wann immer Sie es verwenden. Die Stärke desstd::function
, nämlich seine type-erasure-Mechanismus, kommt nicht für frei, und wir könnten (aber nicht zwangsläufig muss) zahlen einen Preis dafür.std::function
ist eine Vorlage-Klasse, wraps callable Typen. Es ist jedoch nicht eingestellt auf den callable type selbst, sondern nur auf seine Rückkehr und die argument-Typen. Die callable-Typ bekannt, wird nur an Bau-Zeit und damitstd::function
nicht eine bereits deklarierte member dieses Typs zu halten, wird eine Kopie des Objekts gegeben an seinen Konstruktor.Grob gesprochen (tatsächlich, die Dinge sind komplizierter als das)
std::function
kann jeweils nur ein Zeiger auf das übergebene Objekt den Konstruktor, und dies wirft ein Leben lang Problem. Wenn der Zeiger verweist auf ein Objekt, dessen Lebensdauer ist kleiner als der derstd::function
Objekt, dann wird der innere Zeiger wird zu baumeln. Um dieses problem zu vermeidenstd::function
könnte eine Kopie des Objekts auf dem heap, durch einen Aufrufoperator new
(oder eine benutzerdefinierte Zuweisung). Die dynamische Speicherverwaltung ist, was die Leute beziehen, die als performance-Strafe impliziertstd::function
.Ich habe vor kurzem einen Artikel geschrieben mit mehr details und, die erklärt, wie (und wo) kann man vermeiden, zahlen den Preis für einen memory allocation.
http://drdobbs.com/cpp/232500059
InformationsquelleAutor der Antwort Cassio Neri
Diese hängt stark ab, wenn Sie übergeben der Funktion, ohne Bindung ein argument (reserviert nicht-heap-space) oder nicht.
Hängt auch von anderen Faktoren, aber diese ist die wichtigste.
Es ist wahr, dass Sie etwas gegen den verglichen wird, kann man nicht einfach sagen, dass es 'verringert den overhead im Vergleich zu nicht mit es an Sie alle, die Sie brauchen, um es zu vergleichen, um über eine alternative Möglichkeit zur übergabe einer Funktion. Und wenn man einfach verzichten, mit der es überhaupt dann war es nicht nötig, von Anfang an
InformationsquelleAutor der Antwort lurscher
Erstens, der overhead wird kleiner mit der Innenseite der Funktion; je höher die Arbeitsbelastung, desto kleiner der overhead.
Zweitens: g++ 4.5 zeigt keinerlei Unterschied im Vergleich zu virtuellen Funktionen:
main.cc
impl.cc
Ausgabe von
g++ --std=c++0x -O3 impl.cc main.cc && ./a.out
:So, keine Angst. Wenn Ihr design/Wartbarkeit verbessern können, von der Bevorzugung
std::function
über virtuelle Anrufe, versuchen Sie. Ich persönlich mag die Idee nicht zwingen, Schnittstellen und Vererbung auf den clients meiner Klassen.InformationsquelleAutor der Antwort Sebastian Mach