我必须决定是否使用模板与虚拟继承 在我的情况下,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%是什么? 我是以错误的方式测试的吗?
我也读过: -