如上所述:如果不按预期用途测量应用程序,请不要这样做 . 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在未定义的行为和高度专业化的代码上构建您的业务:
6 回答
如果不按预期用途测量应用程序,请不要这样做 .
为什么不呢 .
现代编译器已经可以检测并将这些模式转换为条件移动 .
现代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在未定义的行为和高度专业化的代码上构建您的业务:
另外 .
你是C或C向导足以验证“优化”的正确性吗?您是否考虑过无符号溢出和未定义的行为w.r.t.签名溢出?输入促销?
我认为答案是否定的,因为你寻求帮助,但没有意识到你的例子中使用的类型是至关重要的,但未提及 .
这种优化几乎可以改善您的表现 . 编译器在优化代码方面比使用这些廉价技巧更好 . 同样在这种情况下,您实际上为代码增加了更多的复杂性,使其有效 less . 必须始终执行乘法并执行加法 .
是
所以你可以把它写成,
仅当条件是
0
或1
时 . 如果条件可以是任何其他值,那么这不会起作用 .即使条件只导致
0
或1
,因为它相当于,不太确定你可以击败整数乘法 . 在某些处理器上需要一个时钟 .
假设0/1条件:
或者:
在进行任何评估尝试之前,您应该为每个变量添加类型 . 人们可能有不同的假设 . 我的建议也就是不要这样做 . 即使你现在做对了,它也会成为一个噩梦 .
将它移动一点,将其移至符号位,然后将符号扩展一直向下移动,然后获得全部或全部为零 .
但这取决于平台 .