测量std :: function的性能成本

时间:2014-05-03 23:08:30

标签: c++ performance c++11

我试图测量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;
}

我得到了以下时间:

enter image description here

平均而言,原始函数指针比std :: function快2.6倍。我的计时是对std :: function还是raw func ptr?

编辑: 我关掉了优化 使用Visual Studio 2012编译 酷睿i5 windows服务器64位

编辑#2: 我正在为每个请求提供完整的优化计时: enter image description here

谢谢!

1 个答案:

答案 0 :(得分:4)

优化版本比std::function更公平。

std::function典型的实现是一个类型擦除的pImpl内部类,它具有virtual调用和复制接口。

这意味着调用std::function的费用大致是virtual方法调用以及原始调用的费用。

理论上std::function可以优化指针到相同的签名函数的情况(以及函数指针到函数指针的情况,用于包装函数指针的tyoe转换)。

如果std::function方法表超出缓存,virtual上的重要额外命中。这在您的测试中不太可能发生,但在实际的实际用例中可能会发生。因此,不仅仅是公平的。