【问题标题】:Performance function call vs multiplication by 1性能函数调用与乘以 1
【发布时间】:2018-01-16 07:07:02
【问题描述】:

看看这个函数:

float process(float in) {
  float out = in;

  for (int i = 0; i < 31; ++i) {
    if (biquads_[i]) {
      out = biquads_[i]->filter(out);
    }
  }

  return out;
}

biquads_std::optional&lt;Biquad&gt;[31]

在这种情况下,我检查每个可选项以检查其是否不为空,然后调用 biquad 的过滤器函数,如果我无条件调用过滤器函数,将其更改为乘以 1 或简单地返回输入值,将是效率更高?

【问题讨论】:

  • 您能否详细说明如果我无条件调用过滤器函数,将其更改为乘以1或简单地返回输入值,会更有效吗? 更多?跨度>
  • 我没有任何数据来支持它,但我想说性能会非常相似,而且你现在的做法比其他方法更清晰。
  • 您可以通过显示编译器为这两种情况生成的汇编语言来更好地了解性能。
  • 如果 *this 不包含值,则行为未定义。 其中 *this 指的是 optional 对象。因此,不能无条件调用filter函数。
  • 无条件调用过滤函数我的意思是更改为双二阶数组而不是可选数组。然后在 process 函数中删除 if (biquads_​​[i]).

标签: c++ performance real-time


【解决方案1】:

很可能它不会产生任何影响(虽然你的问题并不完全清楚,但还是有点猜测)。有两个原因:1) 除非代码将在 非常 热路径中使用,否则即使一种方式比另一种方式快几纳秒也没关系。 2)您的编译器优化器很可能足够聪明,可以生成在两种情况下执行接近(如果不相同)相同的代码。你测试了吗?您是否对其进行了基准测试/配置文件?如果不;这样做 - 启用优化。

努力编写清晰、可读、可维护的代码。稍后当您确实遇到问题并且您的分析器将您的函数指出为热点时,请担心微优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多