Ho eseguito un mio benchmark sul mio computer (Intel i3-3220 @ 3.3GHz, Fedora 18) e ho ottenuto risultati molto inaspettati. Un puntatore a funzione era in realtà un po 'più veloce di una funzione in linea.Il puntatore funzione viene eseguito più rapidamente della funzione inline. Perché?
Codice:
#include <iostream>
#include <chrono>
inline short toBigEndian(short i)
{
return (i<<8)|(i>>8);
}
short (*toBigEndianPtr)(short i)=toBigEndian;
int main()
{
std::chrono::duration<double> t;
int total=0;
for(int i=0;i<10000000;i++)
{
auto begin=std::chrono::high_resolution_clock::now();
short a=toBigEndian((short)i);//toBigEndianPtr((short)i);
total+=a;
auto end=std::chrono::high_resolution_clock::now();
t+=std::chrono::duration_cast<std::chrono::duration<double>>(end-begin);
}
std::cout<<t.count()<<", "<<total<<std::endl;
return 0;
}
compilato con
g++ test.cpp -std=c++0x -O0
Il ciclo 'toBigEndian' finisce sempre intorno ai 0,26-0,27 secondi, mentre 'toBigEndianPtr' prende 0.21-0.22 secondi.
Ciò che rende questo ancora più strano è che quando rimuovo 'totale', il puntatore della funzione diventa quello più lento a 0,35-0,37 secondi, mentre la funzione in linea è a circa 0,27-0,28 secondi.
La mia domanda è:
Perché il puntatore a funzione più veloce della funzione inline quando esiste 'totale'?
Non stai ottimizzando. Il profiling del codice di non ottimizzazione è inutile. –
Con -O3 la velocità è sempre la stessa. – Hassedev
Dubito che ... –