我试图测量std :: function与C-Function指针的性能成本。我想知道我的测量技术是否对这个特定功能都是公平的(分贝,见下文)。
为了测试以下测量,我重新编译了N 1到6的程序(见下文)并切换了注释的std :: function vs raw函数指针。
代码:
#include<iostream>
#include<thread>
typedef float (*twoArgFuncPtr)(float, float);
//function name and signature
typedef float (*twoArgFuncPtr)(float, float);
//a function matching the signature of the typedef function
float decibels(float p1, float p2)
{
return (float)log(p2 / p1);
}
int main()
{
typedef std::chrono::high_resolution_clock high_resolution_clock;
typedef std::chrono::milliseconds milliseconds;
twoArgFuncPtr fnc= decibels;
std::function<float(float,float)> fncObj= decibels;
const int numLoops= 1000000*1; //re-compiled for 1000000 * to N=6
high_resolution_clock::time_point start= high_resolution_clock::now();
float result=0;
for(int i=1, j=numLoops; i < numLoops-1; i++, j--)
{
//toggle the comment between the next two lines
result+= fnc((float)i, (float)j); //call by raw ptr
//result+= fncObj((float)i, (float)j); //call by obj //uncomment this line to test std::function
}
high_resolution_clock::time_point end= high_resolution_clock::now();
std::cout<<"Time in seconds: "<<std::chrono::duration_cast<milliseconds>(end-start).count()<<std::endl;
std::cout<<"Result: "<<result<<std::endl;
return 0;
}
我得到了以下时间:
平均而言,原始函数指针比std :: function快2.6倍。我的计时是对std :: function还是raw func ptr?
编辑: 我关掉了优化 使用Visual Studio 2012编译 酷睿i5 windows服务器64位
编辑#2: 我正在为每个请求提供完整的优化计时:
谢谢!
答案 0 :(得分:4)
优化版本比std::function
更公平。
std::function
典型的实现是一个类型擦除的pImpl内部类,它具有virtual
调用和复制接口。
这意味着调用std::function
的费用大致是virtual
方法调用以及原始调用的费用。
理论上std::function
可以优化指针到相同的签名函数的情况(以及函数指针到函数指针的情况,用于包装函数指针的tyoe转换)。
如果std::function
方法表超出缓存,virtual
上的重要额外命中。这在您的测试中不太可能发生,但在实际的实际用例中可能会发生。因此,不仅仅是公平的。