dynamic_cast每个调用是否比带有null检查的缓存var昂贵?

时间:2018-08-10 21:48:28

标签: c++ casting

对于长时间(几小时)要每秒调用100次或更多次的类中的函数,就性能而言,以下哪种方法更好?

  1. 每次调用函数时,使用dynamic cast将var强制转换为所需的类型:

    Foo()
    {
      TypeA* A = dynamic_cast<TypeA>(B);
      // do something with A
    }
    
  2. 将转换结果缓存到所需类型的变量中,仅在缓存为null时才进行转换,否则使用缓存:

    Foo()
    {
      TypeA* A = GetCachedA();
      // do something with A
    }
    
    TypeA* GetCachedA()
    {
      if(CachedA == nullptr)
        CachedA = dynamic_cast<TypeA>(B);
      return CachedA;
    }
    

这种差异对某些人来说可能是微不足道的,但请记住,这是一个性能至关重要的场景,而每一个性能下降都很重要。

1 个答案:

答案 0 :(得分:2)

当我对此进行测试时(公认的是,不是最近),dynamic_cast足够昂贵,以至于倾向于缓存指针。但这是我在与您不同的情况下在一台过时的机器上进行的测试。

当时,我使用了稍微不同的基本设计。我没有检查空指针,而是使用了一个指向函数的指针(可以使用虚函数...),该指针已初始化为指向执行动态转换的函数,然后保存结果,然后(关键部分)用刚刚返回缓存的指针的函数的地址覆盖了函数指针。

在将指针添加到缓存时,这增加了一些额外的开销,但是在以后的使用中减少了(相当一点)。至少在我的测试中,只要您至少使用指针三次,那便是一次胜利(但是,在这里,您的行驶里程可能并且可能会有所不同)。

相关问题