Nic*_*ker 3 c c++ binary-operators
有没有办法计算:
/** clipped(a - b) **/
unsigned char clipped_substract(unsigned char a, unsigned char b)
{
return a > b ? a - b : 0;
}
Run Code Online (Sandbox Code Playgroud)
使用一些二进制操作而不是测试?
原始函数编译为有条件的移动并且不受您所关心的性能的影响。您试图在这里执行过早的优化,这对您绝对没有好处。编写可读代码,然后对其进行分析,然后识别和优化性能瓶颈。
你说“测试会降低性能”。如果你想做这样的微优化,你应该致力于理解这些经验法则背后的原因,而不是将它们作为无条件的真理来应用。
降低“测试”性能的是(错误预测的)控制流分支。现代 CPU 大量使用指令流水线,并且控制流分支意味着不清楚接下来是哪条指令。常见的方法是 CPU 猜测(使用分支预测硬件/算法)分支将走哪条路。如果弄错了,它必须冲洗整个管道并重新填充它,这浪费了周期。
好吧,有问题的代码没有这样的问题。它编译为有条件的移动:
clipped_substract(unsigned char, unsigned char):
mov eax, edi
mov edx, 0
sub eax, esi
cmp dil, sil
cmovbe eax, edx
ret
Run Code Online (Sandbox Code Playgroud)
可以看到这里没有控制流分支。请参阅为什么有条件的移动不容易受到分支预测失败的影响?为什么这不受上述性能问题的影响。
我再说一遍:编写可读的代码,然后对其进行分析,然后识别并优化性能瓶颈。您在这里尝试的是修复一个根本不存在的性能问题代码(更不用说您没有证明此代码的性能甚至与您的程序性能相关)。