在您对重复的标题感到畏缩之前,另一个问题不适合我在这里问的问题(IMO)。所以。
我真的很想在我的应用程序中使用虚拟函数,让事情变得简单一百倍(这不是 OOP 的全部内容吗;))。但我在某处读到它们是以性能成本为代价的,除了过早优化的同样老套的炒作之外什么也没有,我决定在一个小型基准测试中快速尝试一下,使用:
CProfiler.cpp
#include "CProfiler.h"
CProfiler::CProfiler(void (*func)(void), unsigned int iterations) {
gettimeofday(&a, 0);
for (;iterations > 0; iterations --) {
func();
}
gettimeofday(&b, 0);
result = (b.tv_sec * (unsigned int)1e6 + b.tv_usec) - (a.tv_sec * (unsigned int)1e6 + a.tv_usec);
};
main.cpp
#include "CProfiler.h"
#include <iostream>
class CC {
protected:
int width, height, area;
};
class VCC {
protected:
int width, height, area;
public:
virtual void set_area () {}
};
class CS: public CC {
public:
void set_area () { area = width * height; }
};
class VCS: public VCC {
public:
void set_area () { area = width * height; }
};
void profileNonVirtual() {
CS *abc = new CS;
abc->set_area();
delete abc;
}
void profileVirtual() {
VCS *abc = new VCS;
abc->set_area();
delete abc;
}
int main() {
int iterations = 5000;
CProfiler prf2(&profileNonVirtual, iterations);
CProfiler prf(&profileVirtual, iterations);
std::cout << prf.result;
std::cout << "\n";
std::cout << prf2.result;
return 0;
}
起初我只做了 100 次和 10000 次迭代,结果令人担忧:非虚拟化为 4ms,虚拟化为 250ms!我几乎要“nooooooo”进去,但后来我将迭代次数提高到了 500,000 次左右;看到结果几乎完全相同(如果没有启用优化标志,速度可能会慢 5%)。
我的问题是,为什么与大量迭代相比,少量迭代会出现如此显着的变化?纯粹是因为虚拟函数在多次迭代时在缓存中很热吗?
免责声明
我知道我的“分析”代码并不完美,但它确实给出了对事物的估计,这才是这个级别上最重要的。另外,我问这些问题是为了学习,而不仅仅是为了优化我的应用程序。