- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在您对重复的标题感到畏缩之前,另一个问题不适合我在这里提出的问题 (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%)。
我的问题是,与大量迭代相比,为什么少量迭代会产生如此显着的变化?纯粹是因为虚函数在那么多次迭代中在缓存中很热吗?
免责声明
我知道我的“分析”代码并不完美,但它确实给出了对事物的估计,这在这个级别上很重要。此外,我提出这些问题是为了学习,而不是仅仅为了优化我的应用程序。
最佳答案
我认为您的测试用例过于人为,没有任何值(value)。
首先,在您分析的函数中,您动态分配和释放一个对象以及调用一个函数,如果您只想分析函数调用,那么您应该这样做。
其次,您没有分析虚函数调用代表给定问题的可行替代方案的情况。虚函数调用提供动态分派(dispatch)。您应该尝试分析一个案例,例如使用虚函数调用作为使用开关类型反模式的替代方法的情况。
关于c++ - 虚函数和性能 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4871954/
我有一个特别的问题想要解决,我不确定是否可行,因为我找不到任何信息或正在完成的示例。基本上,我有: class ParentObject {}; class DerivedObject : publi
在我们的项目中,我们配置了虚 URL,以便用户可以在地址栏中输入虚 URL,这会将他们重定向到原始 URL。 例如: 如果用户输入'http://www.abc.com/partner ',它会将它们
我是一名优秀的程序员,十分优秀!