优化与零的简单比较以提高性能

Optimize simple comparison with zero for performance

本文关键字:高性能 比较 简单 优化      更新时间:2023-10-16

我的代码中有一个瓶颈(大约 20% 的 CPU 时间(,在以下 if 语句中:

if (a == 0) { // here
    ...
}

其中a是一个uint8_t,所以是一个从0到255的数字。

是否有任何低级优化可以使其更快?
我想过使用按位 NOR (~(a| 0)) ,但这只有在 1 位时才有效a对吧?

以防万一:在这种特殊情况下,我不关心代码的可读性。

除非你的编译器是垃圾,否则你无法做任何事情来加速整数比较。

但是,您观察到的瓶颈可能并不是比较本身,而是不吉利的分支预测的结果。

有两种方法可以解决此问题:

如果"分支或不分支">遵循一种模式,请在程序逻辑中将最后一秒的决定进一步向上移动,您可以在其中使用该模式,只是不要在热函数中分支。这可能需要认真思考。一种找出您是否有模式的黑客方法:打印1如果您分支并0其他足够的调用,Zip 将启动并查看生成的存档是否比您打印的值数量小得多(以位为单位(。(当然,如果你喜欢它更理论化,也有聪明的公式。

如果大多数时候选择一个分支而不是另一个分支,则可以告诉编译器哪个分支是可能的分支。使用 gcc,签出__builtin_expect ,对于其他编译器,请阅读手册。

对于这两种解决方案都很重要:您需要衡量这是否真的有帮助。尤其是第二个不会神奇地变得更好,甚至可能会让事情变得更糟。