首页 > 解决方案 > 虚拟功能和性能

问题描述

假设我有以下课程:

class A 
{
public:
   virtual int f(int a, int b)
   {
      return a+b;
   }
   virtual ~A()
   {}
};

class B : public A
{
public:
   virtual int f(int a, int b) override
   {
      return a+b;
   }
};

我们来看看以下函数的基准测试结果:

static void A_PTR_TO_B_TEST(benchmark::State& state) {
  A* obj = new B;
  for (auto _ : state) {
    obj->f(5, 6);
  }
  delete obj;
}
BENCHMARK(A_PTR_TO_B_TEST);

static void A_PTR_TO_A_TEST(benchmark::State& state) {
  A* obj = new A;
  for (auto _ : state) {
     obj->f(5, 6);
  }
  delete obj;
}
BENCHMARK(A_PTR_TO_A_TEST);

static void B_PTR_TO_B_TEST(benchmark::State& state) {
   B* obj = new B;
   for (auto _ : state) {
     obj->f(5, 6);
   }
   delete obj;
 }
 BENCHMARK(B_PTR_TO_B_TEST);

使用 CLANG12.0 -std=c++2a -O0 在此处输入图像描述

我的第一个问题是:为什么 A_PTR_TO_B_TEST 和 A_PTR_TO_A_TEST 之间有这么大的区别?

使用 CLANG12.0 -std=c++2a -O3 在此处输入图像描述

演示

GCC10.3 -std=c++2a -O3 对所有三个测试给出相同的结果。

我已经多次运行此测试,A_PTR_TO_A_TEST 总是比 A_PTR_TO_B_TEST 花费稍长的时间。所以我的第二个问题是了解为什么 A_PTR_TO_B_TEST 和 A_PTR_TO_A_TEST 之间存在差异。

标签: c++performanceoopvirtual-functions

解决方案


推荐阅读