使用 __builtin_expect() 或 Linux 内核时,"very likely" 有多少可能和不太可能

How much is "very likely" when using __builtin_expect() or Linux kernel's likely and unlikely

您应该只使用 __builtin_expect() 或 Linux 内核的 likely()unlikely() 如果它 "very likely" 您的代码将遵循预测的分支。 "very likely" 是多少?

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

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

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

那么,这种情况是使用 __builtin_expect() 还是 Linux 内核的 likely()? 这种情况是否满足"very likely"条件?

这里不需要likely/unlikely。分支预测器会为你处理这个。但是,如果您很想知道是否存在差异,请遵循以下范例:进行测量,而不仅仅是猜测。

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

一般来说,"helping the compiler"通常不是一个好主意。在某些情况下它可能会有用,但真的很难想出这些。
likely()/unlikely() 的情况下,如果你知道你的确切目标平台并且你知道它是一些特定的 CPU 完全没有分支预测,那么也许你可以从中得到一些东西,否则这可能是浪费时间。