7 Stimmen

boost::function-Laufzeitleistung

Ich bin gerade dabei, einen plattformunabhängigen Wrapper für dynamisch geladene Bibliotheken zu implementieren. Natürlich, wenn ich Funktionen aus den Bibliotheken lade, muss ich sie als Zeiger für die zukünftige Verwendung speichern. Ich dachte an die Verwendung von boost::function's für das anstelle von normalen Funktionszeigern. Sicher, das wird die Kompilierzeit erhöhen, aber davor habe ich keine Angst. Sondern:

Wie hoch ist der Overhead, den boost::function verursacht, wenn aufrufen die gespeicherte Funktion? Gibt es eine? Wie groß ist sie?

Ich schätze, dass ich nicht viel Overhead habe, wenn ich solche Funktionen von Zeit zu Zeit aufrufe, aber wie sieht es mit Funktionen aus, die oft aufgerufen werden (extremes Beispiel)? glVertex auf eine geladene GL-Bibliothek). Wie sehr würde dies die Leistung beeinträchtigen?

Der Quellensprung hat nicht viel gebracht :>.

Auch wenn es compilerabhängig ist, bin ich hauptsächlich an GCC und MSVC interessiert.

5voto

Nick Bastin Punkte 28870

Wie im Boost angegeben Dokumentation aufrufend, eine boost::function verursacht in den meisten Fällen die Kosten eines Aufrufs durch einen Funktionszeiger. Mit anderen Worten, wenn Sie ohnehin Funktionszeiger verwenden müssen, ist es ein Reinfall, und Sie erhalten eine Reihe von verbesserten Funktionen umsonst.

1voto

Terry Mahaffey Punkte 11439

Boost::function hat es in tr1 geschafft, so dass es auf modernen Compilern std::tr1::function ist und auf anderen nur std::function. realmente modernen Compilern.

In jedem Fall hat std::function, wie Sie festgestellt haben, einen Overhead von nicht Null für die Erstellung (einschließlich der Erstellung von Kopien des Objekts). Theoretisch sollte es den gleichen Overhead wie ein roher Funktionszeiger für den Aufruf haben; d.h. es gibt eine Ebene der Indirektion - aber wirklich clevere Compiler können diese Ebene der Indirektion einbinden.

Es gibt natürlich Dinge, die man in einer std::function speichern kann, die nicht in einen Funktionszeiger passen oder gespeichert werden können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X