2010-01-30 3 views
5

Je voulais savoir à quelle vitesse un appel de fonction virtuelle à héritage unique est rapide par rapport à un même appel boost :: function. Sont-ils presque les mêmes en performance ou boost :: function plus lent? Je suis conscient que les performances peuvent varier d'un cas à l'autre, mais, en règle générale, ce qui est plus rapide, et dans quelle mesure est-ce le cas?Appel de fonction virtuelle C++ versus boost :: appel de fonction speedwise

Merci, Guilherme

- modifier

test de KennyTM était suffisamment convaincant pour moi. boost :: function ne semble pas être beaucoup plus lent qu'un vcall pour mes propres besoins. Merci.

+1

aussi, c'est une micro-optimisation ... –

Répondre

7

Dans un cas très particulier, pensez à appeler une fonction vide 10 fois.


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: (avec 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 avec g++ -O3, puis temps avec time,

  • Code A prend 0.30 secondes.
  • Le code B prend 0,54 secondes.

observant le code montage, il semble que la lenteur peut être due à des exceptions et utilisation de la possibilité et que f peut être NULL. Mais étant donné le prix d'un appel boost::function est seulement 2,4 nanosecondes (sur ma machine 2 GHz), le code réel dans votre do_x() pourrait l'ombre à peu près. Je dirais que ce n'est pas une raison pour éviter boost::function.

+1

Et où est l'unique-héritage dans le cas A? ;) –

+1

@gf: Vous savez comment fonctionne vtable? L'héritage n'a pas d'importance car toute la vtable est copiée. – kennytm

+3

Bien qu'un tel test rapide soit en effet très utile, il ne fait que vous indiquer comment le code se comporte en fonction des performances dans des conditions spécifiques (scénario de test, compilateur, paramètres du compilateur, plate-forme, etc.). Ce n'est pas pour nier votre résultat, je me rappelle juste de faire attention en généralisant à partir d'un seul cas de test. – sbi