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

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

本文关键字:builtin very 多少 likely expect Linux 内核 使用      更新时间:2023-10-16

如果您的代码将遵循预测的分支,则应仅使用__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()的好情况?这种情况是否满足"非常可能"的条件?

很难相信网络代码中可能有CPU性能瓶颈。
即使存在,也没有理由在这里进行分支预测因子失败,而如今的分支预测指标确实很好。
即使有这种优化的原因,也可以使用某些平台特定且几乎不可读取的代码来进行配置文件引导(PGO),而不是堵塞源。

通常,"帮助编译器"通常是一个坏主意。在一些情况下,它很有用,但是很难提出这些。
对于likely()/unlikely(),如果您知道确切的目标平台,并且知道这是一些特定的CPU,而没有分支机构预测,那么也许您可以从中做出一些东西,否则可能是浪费时间。

<</p>

这里不需要/不太可能。分支预测器将为您处理。但是,如果您渴望知道是否存在差异,请遵循此范式:进行测量,不要只是猜测。