首页 文章

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

提问于
浏览
0

我可以替换以下IF语句:

if(condition){
    x += y;
}

有:

x = x + ((y - x) * (condition));

删除分支 .

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

6 回答

  • 1

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

    为什么不呢 .

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

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

    如上所述:如果不按预期用途测量应用程序,请不要这样做 . Don 't test on arbitrary benchmarks, which yield misleading (and thus costly) results most of the time. And of course, prefer algorithm and architecture optimizations instead of such microoptmizations; keeping code maintainable is typically cheaper in the longer term; don' t在未定义的行为和高度专业化的代码上构建您的业务:

    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向导足以验证“优化”的正确性吗?您是否考虑过无符号溢出和未定义的行为w.r.t.签名溢出?输入促销?

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

  • 2

    这种优化几乎可以改善您的表现 . 编译器在优化代码方面比使用这些廉价技巧更好 . 同样在这种情况下,您实际上为代码增加了更多的复杂性,使其有效 less . 必须始终执行乘法并执行加法 .

  • 3
    if(condition){
        x += y;
    }
    

    if(condition){
        x =x+ y;
    }
    

    所以你可以把它写成,

    x = x + ((y) * (condition));
    

    仅当条件是 01 时 . 如果条件可以是任何其他值,那么这不会起作用 .

    x = x + ((y - x) * (condition));
    

    即使条件只导致 01 ,因为它相当于,

    if(condition){
            x=y;
        }
    
  • -5

    不太确定你可以击败整数乘法 . 在某些处理器上需要一个时钟 .

    假设0/1条件:

    x+= condition * y;
    

    或者:

    x+= (- condition) & y;
    
  • 10

    在进行任何评估尝试之前,您应该为每个变量添加类型 . 人们可能有不同的假设 . 我的建议也就是不要这样做 . 即使你现在做对了,它也会成为一个噩梦 .

  • 8

    将它移动一点,将其移至符号位,然后将符号扩展一直向下移动,然后获得全部或全部为零 .

    x + (( y -x) & (((!!condition)<<31)>>31)
    

    但这取决于平台 .

相关问题