私のコンピュータ(Intel i3-3220 @ 3.3GHz、Fedora 18)でベンチマークを実行したところ、予期しない結果が得られました。関数ポインタは、実際にはインライン関数より少し速いです。関数ポインタは、インライン関数より速く実行されます。どうして?
コード: 'toBigEndianPtr' は0.21から0.22秒かかりながら
g++ test.cpp -std=c++0x -O0
でコンパイルさ
#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;
}
'toBigEndian' ループは、周りの0.26から0.27秒で常に終わります。
これをさらに奇妙にするのは、「合計」を削除すると、関数ポインタが0.35-0.37秒で遅くなり、インライン関数は約0.27-0.28秒になります。
私の質問は:
なぜ「合計」は存在するインライン関数よりも関数ポインタ速いのですか?
最適化していません。最適化されていないコードのプロファイリングは無意味です。 –
-O3では速度は変わりません。 – Hassedev
私はそれを疑う... –