位操作替换IF语句并提高性能

use*_*112 1 c c++ optimization performance bit-manipulation

我可以替换以下IF语句:

if(condition){
    x += y;
}
Run Code Online (Sandbox Code Playgroud)

有:

x = x + ((y - x) * (condition));
Run Code Online (Sandbox Code Playgroud)

删除分支.

有没有办法避免上面的乘法,并用一个按位操作替换它,使其更快?

Seb*_*ach 10

如果不按预期用途测量应用程序,请不要这样做.

为什么不.

现代编译器已经可以检测并将这些模式转换为条件移动.

现代CPU推测性地"在时间之前"运行代码,这可能比复杂的位表达式更快; 此外,还有一个分支目标缓冲区,可以记住本地环路中的决策,然后根据BTB提前推测运行代码.

如上所述:如果不按预期用途衡量您的应用程序,请不要这样做.不要对任意基准测试,这会在大多数情况下产生误导(并因此代价高昂)的结果.当然,更喜欢算法和体系结构优化而不是这种微观设计; 保持代码可维护性从长远来看通常更便宜; 不要在未定义的行为和高度专业化的代码上构建您的业务:

https://upload.wikimedia.org/wikipedia/commons/thumb/6/66/The_Leaning_Tower_of_Pisa_SB.jpeg/250px-The_Leaning_Tower_of_Pisa_SB.jpeg

也.

你的C或C++向导是否足以验证"优化"的正确性?您是否考虑过无符号溢出和未定义的行为?提示促销?

认为答案是否定的,因为你寻求帮助,但没有意识到你的例子中使用的类型是至关重要的,但未提及.


izo*_*ica 8

这种优化实际上永远不会改善您的表现.编译器在优化代码方面做得比使用这些廉价技巧更好.同样在这种情况下,您实际上会增加代码的复杂性,从而降低其效率.必须始终执行乘法并执行加法.