我在我的电脑(Intel i3-3220 @ 3.3GHz,Fedora 18)上运行了我的基准测试,得到了非常意想不到的结果。函数指针实际上比内联函数快一点。
代码:
#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;
}
编译
g++ test.cpp -std=c++0x -O0
'toBigEndian' 循环总是在 0.26-0.27 秒左右完成,而 'toBigEndianPtr' 需要 0.21-0.22 秒。
更奇怪的是,当我删除“total”时,函数指针在 0.35-0.37 秒处变得较慢,而内联函数大约为 0.27-0.28 秒。
我的问题是:
为什么存在“total”时函数指针比内联函数快?