Eu sempre me questionei isso, especialmente porque - há alguns anos atrás - eu também fiz esse teste comparando os tempos de uma chamada de método de membro padrão com uma virtual e fiquei realmente irritado com os resultados naquele momento, tendo chamadas virtuais vazias sendo 8 vezes mais lento que os não virtuais.
Hoje eu tive que decidir se deveria ou não usar uma função virtual para alocar mais memória na minha classe de buffer, em um aplicativo muito crítico para o desempenho, então pesquisei (e encontrei você) e, no final, fiz o teste novamente.
// g++ -std=c++0x -o perf perf.cpp -lrt
#include <typeinfo> // typeid
#include <cstdio> // printf
#include <cstdlib> // atoll
#include <ctime> // clock_gettime
struct Virtual { virtual int call() { return 42; } };
struct Inline { inline int call() { return 42; } };
struct Normal { int call(); };
int Normal::call() { return 42; }
template<typename T>
void test(unsigned long long count) {
std::printf("Timing function calls of '%s' %llu times ...\n", typeid(T).name(), count);
timespec t0, t1;
clock_gettime(CLOCK_REALTIME, &t0);
T test;
while (count--) test.call();
clock_gettime(CLOCK_REALTIME, &t1);
t1.tv_sec -= t0.tv_sec;
t1.tv_nsec = t1.tv_nsec > t0.tv_nsec
? t1.tv_nsec - t0.tv_nsec
: 1000000000lu - t0.tv_nsec;
std::printf(" -- result: %d sec %ld nsec\n", t1.tv_sec, t1.tv_nsec);
}
template<typename T, typename Ua, typename... Un>
void test(unsigned long long count) {
test<T>(count);
test<Ua, Un...>(count);
}
int main(int argc, const char* argv[]) {
test<Inline, Normal, Virtual>(argc == 2 ? atoll(argv[1]) : 10000000000llu);
return 0;
}
E fiquei realmente surpreso que isso - de fato - realmente não importa mais. Embora faça sentido ter inline mais rapidamente do que os não virtuais, e eles sendo mais rápidos que os virtuais, geralmente chega à carga do computador em geral, se seu cache tem os dados necessários ou não, e embora você possa otimizar no nível do cache, eu acho, que isso deve ser feito pelos desenvolvedores do compilador mais do que pelos desenvolvedores de aplicativos.