虚函数调用成本是正常函数调用的1.5倍(带测试用例)

时间:2017-05-17 04:22:48

标签: c++ c++14 vtable

我必须决定是否使用模板与虚拟继承 在我的情况下,trade-off让人很难选择 最后,它归结为"虚拟呼叫的真正成本(CPU)是多少?"

我发现很少有资源敢于衡量实际数量中的 vtable 费用,例如https://stackoverflow.com/a/158644,指向http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf的第26页。

以下是摘录: -

  

然而,这个(虚拟的)开销大约为 20% 12% - 远小于   编译器之间的差异。

在依赖事实之前,我决定自己测试一下。

我的测试代码有点长(约40行),你也可以在行动中的链接中看到它 该数字是虚拟呼叫使用的时间除以正常呼叫的比率 出乎意料的是,结果与open-std所说的矛盾

就是这样: -

#include <iostream>
#include <chrono>
#include <vector>
using namespace std;
class B2{
        public: int randomNumber=((double) rand() / (RAND_MAX))*10;
        virtual ~B2() = default;
        virtual int f(int n){return -n+randomNumber;}
        int g(int n){return -n+randomNumber;}
};
class C : public B2{
    public: int f(int n) override {return n-randomNumber;}
};
int main() {
    std::vector<B2*> bs;
    const int numTest=1000000;
    for(int n=0;n<numTest;n++){
        if(((double) rand() / (RAND_MAX))>0.5){
            bs.push_back(new B2());
        }else{
            bs.push_back(new C());
        }
    };
    auto t1 = std::chrono::system_clock::now();
    int s=0;
    for(int n=0;n<numTest;n++){ 
        s+=bs[n]->f(n);
    };
    auto t2= std::chrono::system_clock::now();
    for(int n=0;n<numTest;n++){
        s+=bs[n]->g(n);
    };
    auto t3= std::chrono::system_clock::now();
    auto t21=t2-t1;
    auto t32=t3-t2;
    std::cout<<t21.count()<<" "<<t32.count()<<" ratio="<< (((float)t21.count())/t32.count()) << std::endl;
    std::cout<<s<<std::endl;
    for(int n=0;n<numTest;n++){
        delete bs[n];
    };
}

问题

虚拟呼叫至少比正常呼叫慢至少+ 50%是什么? 我是以错误的方式测试的吗?

我也读过: -

0 个答案:

没有答案