【问题标题】:Using virtual functions instead of IF statements is faster?使用虚函数而不是 IF 语句更快?
【发布时间】:2012-01-15 00:48:57
【问题描述】:

我记得在网上某处读到,在极低延迟的情况下,最好使用虚函数代替 IF 语句。

这是真的吗?他们基本上是在说动态多态性更适合速度情况吗?

是否有任何用户可以分享任何其他 C++ 低延迟“怪癖”?

【问题讨论】:

  • 我认为这取决于一系列因素——至少包括级联的ifs 数量。考虑编译器和 AST 中每个节点的 Visitor pattern 的情况。当然,使用这样的模式可能会导致其他不太理想的特性,例如在一堆类上传播代码。
  • 就像一个好轮胎,您首先需要一件事:轮廓、轮廓、轮廓。
  • 我认为这将高度依赖于确切的代码,唯一真正的答案是将它计时数十亿次,看看有什么区别。

标签: c++ visual-c++


【解决方案1】:

我非常怀疑单个 if/else 语句会比使用虚函数慢:虚函数通常会强制执行管道停顿并限制优化机会。 if 语句可能会使管道停止,但如果它经常执行,则预测可能会正确。但是,如果您的替代方案是在几个 if/else 语句的级联与一个虚拟函数调用之间,那么后者可能会更快。此外,如果通过使用虚拟函数与分支执行的总代码是不同的函数,那么最终会大大减小它可能会导致指令高速缓存上的高速缓存未命中数很少。也就是说,这取决于情况。最好的方法是测量。请注意,测量人工代码只是试图调查两种方法之间的差异,但实际上并没有进行任何处理,这会产生误导性的结果。但是,当您需要生成非常低延迟的代码时,您通常可以花费更多时间来编写它,即尝试多种不同的方法可能是可行的。

虽然我的同事们倾向于不赞成我使用模板方法来避免运行时分支,但我最终得到的代码通常编译起来很慢,但运行起来却非常快。当然,这取决于编译时已知的函数或分支。在我使用过的领域,例如对于消息处理,通常有一个动态决策就足够了,例如每个消息一个(即一个虚函数调用),然后是不涉及任何动态类型的处理(这仍然是条件,例如表中的值的数量)。

【讨论】:

  • 请注意,一些处理器也尝试预测间接分支(例如,AMD 系列 15H 有一个 512 个条目表),从而增加了“在上下文中测量和测量”建议的重要性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多