gpt4 book ai didi

c++ - 虚函数和性能 C++

转载 作者:可可西里 更新时间:2023-11-01 18:04:09 24 4
gpt4 key购买 nike

在您对重复的标题感到畏缩之前,另一个问题不适合我在这里提出的问题 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com