【问题标题】:How much is "very likely" when using __builtin_expect() or Linux kernel's likely and unlikely使用 __builtin_expect() 或 Linux 内核的可能和不太可能时“非常可能”有多少
【发布时间】:2016-12-11 05:40:49
【问题描述】:

如果你的代码“很有可能”遵循预测的分支,你应该只使用__builtin_expect() 或Linux 内核的likely()unlikely()。 “很可能”有多少?

我正在开发一个数据包嗅探器程序。我的程序从 2 个 NIC 捕获数据包并将它们保存在 2 个单独的缓冲区中。我希望从 NIC 1 收到 25 个数据包后,从 NIC2 收到一个数据包。

所以,我需要使用如下 if 语句:

if (_received_from_nic1) {
    _Connection_Number++;
} else {
    _Session_Number++;
}

那么,这是使用__builtin_expect() 还是Linux 内核的likely() 的好时机? 这种情况是否满足“很可能”的条件?

【问题讨论】:

标签: c++ c performance built-in


【解决方案1】:

很难相信网络代码中可能存在 CPU 性能瓶颈。
即使有,分支预测器也没有理由在这里失败,而且分支预测器现在真的很好。
即使有这种优化的原因,执行配置文件引导 (PGO) 也比使用一些特定于平台且难以阅读的代码阻塞源代码要聪明得多。

一般来说,“帮助编译器”通常是个坏主意。在某些情况下它可能很有用,但很难想出这些。
likely()/unlikely() 的情况下,如果您知道您的确切目标平台,并且您知道它是一个完全没有分支预测的特定 CPU,那么也许您可以从中做出一些事情,否则可能会浪费时间。

【讨论】:

    【解决方案2】:

    这里不需要可能/不太可能。分支预测器将为您处理此问题。但是,如果您想知道是否存在差异,请遵循以下范例:进行测量,而不仅仅是猜测。

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2011-07-13
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2012-06-10
      • 2010-11-29
      • 2010-09-27
      相关资源
      最近更新 更多