2010-01-30 19 views
5

Ich wollte wissen, wie schnell ist eine Single-Vererbung virtuellen Funktionsaufruf im Vergleich zu einem Boost :: Funktionsaufruf. Sind sie in der Leistung fast gleich oder Boost :: Funktion langsamer?C++ virtueller Funktionsaufruf versus boost :: Funktionsaufruf speedwise

Ich bin mir bewusst, dass die Leistung von Fall zu Fall variieren kann, aber als eine allgemeine Regel, die schneller ist, und zu einem wie großen Grad ist das so?

Danke, Guilherme

- bearbeiten

war KennyTM-Test für mich überzeugend genug. boost :: function scheint für meine eigenen Zwecke nicht so viel langsamer zu sein als ein vcall. Vielen Dank.

+1

auch, es ist eine Mikro-Optimierung ... –

Antwort

7

Als besonderen Fall sollte eine leere Funktion 10 mal aufgerufen werden.


Code A:

struct X { 
      virtual ~X() {} 
     virtual void do_x() {}; 
}; 
struct Y : public X {}; // for the paranoid. 

int main() { 
     Y* x = new Y; 
     for (int i = 100000000; i >= 0; -- i) 
       x->do_x(); 
     delete x; 
     return 0; 
} 

-Code B: (mit Boost 1,41):

#include <boost/function.hpp> 

struct X { 
    void do_x() {}; 
}; 

int main() { 
    X* x = new X; 
    boost::function<void (X*)> f; 
    f = &X::do_x; 
    for (int i = 100000000; i >= 0; -- i) 
     f(x); 
    delete x; 
    return 0; 
} 

Compile mit g++ -O3, dann Zeit mit time,

  • Code A dauert 0,30 Sekunden.
  • Code B dauert 0,54 Sekunden.

den Assembler-Code Inspizieren, so scheint es, dass die Langsamkeit aufgrund Ausnahmen geben kann und die Handhabung der Möglichkeit und dass f kann NULL sein. Aber angesichts des Preises von einem boost::function Anruf ist nur 2,4 Nanosekunden (auf meinem 2 GHz-Rechner), könnte der eigentliche Code in Ihrem do_x() dies ziemlich viel Schatten. Ich würde sagen, es ist kein Grund zu vermeiden, boost::function.

+1

Und wo ist die Single-Vererbung in Fall A? ;) –

+1

@gf: Weißt du wie vtable funktioniert? Die Vererbung spielt keine Rolle, da die gesamte vtable kopiert wird. – kennytm

+3

Während solch ein schneller Test in der Tat sehr hilfreich ist, sagt es Ihnen nur, wie sich der Code leistungsmäßig unter bestimmten Bedingungen verhält (Testfall, Compiler, Compilereinstellungen, Plattform usw.). Dies ist nicht um Ihr Ergebnis zu verleugnen, ich erinnere nur daran, vorsichtig zu sein, wenn Sie von einem einzigen Testfall aus verallgemeinern. – sbi