您应该只使用__builtin_expect()
或 Linux 内核的 likely()
和unlikely()
如果您的代码“很可能”遵循预测的分支。 “很有可能”是多少?
我正在开发一个数据包嗅探器程序。我的程序从 2 个 NIC 捕获数据包并将它们保存在 2 个独立的缓冲区中。我预计从 NIC 1 收到 25 个数据包后,从 NIC2 收到 1 个数据包。
所以,我需要使用 if 语句,例如:
if (_received_from_nic1) {
_Connection_Number++;
} else {
_Session_Number++;
}
那么,这种情况适合使用__builtin_expect()
吗?或 Linux 内核的 likely()
?
这种情况是否满足“很可能”的条件?
最佳答案
很难相信网络代码中可能存在 CPU 性能瓶颈。
即使有,分支预测器也没有理由在这里失败,而且分支预测器现在确实很好。
即使这种优化是有原因的,执行配置文件引导 (PGO) 也比用一些特定于平台且难以阅读的代码堵塞源代码要明智得多。
一般来说,“帮助编译器”通常是一个坏主意。在某些情况下它可能很有用,但确实很难想出这些。
在 likely()
/unlikely()
的情况下,如果您知道确切的目标平台,并且知道它是一些完全没有分支预测的特定 CPU,那么也许您可以从中得到一些东西,否则可能是浪费时间。
关于c++ - 使用 __builtin_expect() 或 Linux 内核时 "very likely"的可能性和可能性是多少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41083333/