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

标签 c++ performance inheritance virtual

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

相关文章:

c++ - 非 unicode printf 不起作用

c++ - 命名空间和 undefined reference

performance - 从并发编程(语言)中受益?

c++ - static_cast是否正在创建新的子对象?

c# - MVC 5 EF 6 TPT 和 ViewModel

c++ - 具有自定义索引的数组

引用下面定义的结构的 C++ 头文件

c++ - 与 C++ 相比,用 Python 编写的 wxWidget 慢多少?

performance - 为什么 x\y 比 (x' * x)\(x' * y) 慢这么多?

c++ - 转换为多重继承