2010-01-30 13 views
5

Quería saber qué tan rápido es una llamada de función virtual de herencia única en comparación con una misma llamada de función boost ::. ¿Son casi lo mismo en rendimiento o es boost :: function más lento?llamada de función virtual C++ versus boost :: llamada de función speedwise

Soy consciente de que el rendimiento puede variar de un caso a otro, pero, por regla general, que es más rápido, y en la forma en gran medida es así?

Gracias, Guilherme

- edición

prueba de KennyTM fue lo suficientemente convincente como para mí. boost :: la función no parece ser mucho más lenta que un vcall para mis propios fines. Gracias.

+1

también, es un micro-optimización ... –

Respuesta

7

Como un caso muy especial, considere llamar a una función vacía 10 veces.


Código 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; 
} 

Código B: (con impulso 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; 
} 

compilar con g++ -O3, entonces el tiempo con time,

  • Código A toma 0.30 segundos.
  • El código B tarda 0,54 segundos.

Inspección del código ensamblador, parece que la lentitud puede deberse a excepciones y gastos de la posibilidad y que f puede ser nulo. Pero dado el precio de una llamada boost::function es de solo 2.4 nanosegundos (en mi máquina de 2 GHz), el código real en su do_x() podría sombrear esto más o menos. Yo diría que no es una razón para evitar boost::function.

+1

Y dónde está el single-herencia en el caso A? ;) –

+1

@gf: ¿Sabes cómo funciona vtable? La herencia no importa porque se copia todo el vtable. – kennytm

+3

Si bien una prueba tan rápida es de hecho muy útil, solo le indica cómo se comporta el código en cuanto a rendimiento bajo sus condiciones específicas (caso de prueba, compilador, configuración del compilador, plataforma, etc.). Esto no es para negar el resultado, solo estoy recordando tener cuidado al generalizar desde un solo caso de prueba. – sbi

Cuestiones relacionadas