如果您的代码“非常可能”遵循预测的分支,则应该只使用__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()
是不是很好?
这种情况是否满足“极有可能”的条件?
答案 0 :(得分:3)
很难相信网络代码中可能存在CPU性能瓶颈 即使有,分支预测器也没有理由在这里失败,分支预测器这些天真的很好 即使有这种优化的原因,使用配置文件引导(PGO)而不是使用某些特定于平台且难以读取的代码来阻塞源代码会更加智能。
一般来说,"帮助编译器" 通常是一个坏主意。在某些情况下它可能有用,但很难想出那些
在likely()
/ unlikely()
的情况下,如果你知道你的确切目标平台并且你知道它是一些没有分支预测的特定CPU,那么也许你可以用它做出一些东西,否则这可能是浪费时间。
答案 1 :(得分:1)
这里没有必要/不太可能。分支预测器将为您处理此问题。但是如果你热衷于知道是否存在差异,那么请遵循这个范例:做测量而不仅仅是猜测。