2010-01-30 11 views
5

Volevo sapere quanto è veloce una chiamata di funzione virtuale a ereditarietà rispetto a una stessa chiamata di boost :: function. Sono quasi uguali nelle prestazioni o sono boost :: funzione più lenta?Chiamata di funzione virtuale C++ rispetto a boost :: chiamata di funzione in senso orario

Sono consapevole del fatto che le prestazioni possono variare da caso a caso, ma, come regola generale, quale è più veloce, e in quale misura è così?

Grazie, Guilherme

- modifica

prova di KennyTM era sufficientemente convincenti per me. boost :: function non sembra essere molto più lento di un vcall per i miei scopi. Grazie.

+1

inoltre, è un micro-ottimizzazione ... –

risposta

7

Come caso molto speciale, considerare di chiamare una funzione vuota 10 volte.


Codice 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; 
} 

Codice B: (con 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; 
} 

Compilare con g++ -O3, allora il tempo con time,

  • Codice A dura 0,30 secondi.
  • Il codice B richiede 0,54 secondi.

Controllo del codice assembly, sembra che la lentezza può essere dovuto eccezioni e manipolazione possibilità e che f può essere NULL. Ma dato il prezzo di una chiamata boost::function è di soli 2,4 nanosecondi (sulla mia macchina a 2 GHz), il codice effettivo nel tuo do_x() potrebbe ombreggiarlo parecchio. Direi, non è un motivo per evitare boost::function.

+1

E dov'è l'ereditarietà singola nel caso A? ;) –

+1

@gf: sai come funziona vtable? L'ereditarietà non ha importanza perché l'intero vtable è copiato. – kennytm

+3

Mentre un test così rapido è davvero molto utile, ti dice solo come il codice si comporta in termini di prestazioni in condizioni specifiche (test case, compilatore, impostazioni del compilatore, piattaforma ecc.). Questo non è per negare il tuo risultato, sto solo ricordando di fare attenzione quando si generalizza da un singolo caso di test. – sbi

Problemi correlati