Antes de encogerse ante el título duplicado, la otra pregunta no se adecuaba a lo que pido aquí (IMO). Asi que.Funciones virtuales y rendimiento C++
Realmente quiero usar funciones virtuales en mi aplicación para hacer que las cosas sean cien veces más sencillas (¿no se trata de eso?)). Pero he leído en alguna parte que llegaron a un costo de rendimiento, sin ver nada, pero el mismo viejo bombo artificial de la optimización prematura, decidí darle un giro rápido en una pequeña prueba de referencia usando:
CProfiler.cpp
#include "CProfiler.h"
CProfiler::CProfiler(void (*func)(void), unsigned int iterations) {
gettimeofday(&a, 0);
for (;iterations > 0; iterations --) {
func();
}
gettimeofday(&b, 0);
result = (b.tv_sec * (unsigned int)1e6 + b.tv_usec) - (a.tv_sec * (unsigned int)1e6 + a.tv_usec);
};
main.cpp
#include "CProfiler.h"
#include <iostream>
class CC {
protected:
int width, height, area;
};
class VCC {
protected:
int width, height, area;
public:
virtual void set_area() {}
};
class CS: public CC {
public:
void set_area() { area = width * height; }
};
class VCS: public VCC {
public:
void set_area() { area = width * height; }
};
void profileNonVirtual() {
CS *abc = new CS;
abc->set_area();
delete abc;
}
void profileVirtual() {
VCS *abc = new VCS;
abc->set_area();
delete abc;
}
int main() {
int iterations = 5000;
CProfiler prf2(&profileNonVirtual, iterations);
CProfiler prf(&profileVirtual, iterations);
std::cout << prf.result;
std::cout << "\n";
std::cout << prf2.result;
return 0;
}
Al principio sólo hicieron 100 y 10000 iteraciones, y los resultados se preocupaban: 4 ms para no virtualizado, y 250m s para el virtualizado! Estuve casi "nooooooo" dentro, pero luego aumenté las iteraciones a alrededor de 500,000; para ver los resultados se vuelven casi completamente idénticos (tal vez un 5% más lentos sin indicadores de optimización habilitados).
Mi pregunta es, ¿por qué hubo un cambio tan significativo con una baja cantidad de iteraciones en comparación con una gran cantidad? ¿Fue simplemente porque las funciones virtuales están calientes en el caché en esas muchas iteraciones?
Negación
entiendo que mi código 'perfiles' no es perfecto, pero, como lo ha hecho, da una estimación de las cosas, que es lo único que importa en este nivel. También estoy haciendo estas preguntas para aprender, no para optimizar únicamente mi aplicación.
plataforma y compilador? – ThomasMcLeod
"(quizás un 5% más lento sin indicadores de optimización habilitados)" - esto implica que está creando un perfil de depuración/compilación no optimizada. Hacerlo arrojará un punto de referencia que generalmente está muy defectuoso para ser útil. ¿Es este el caso? –
TI no funcionaba en Ubuntu 10.10, utilizando g ++, con _and_ sin indicadores de optimización. – dcousens