Nik*_*hhi 28 c c++ cpu optimization performance
变量x是int,带有可能的值:-1, 0, 1, 2, 3.哪个表达式会更快(在CPU滴答中):
1. (x < 0)
2. (x == -1)
Run Code Online (Sandbox Code Playgroud)
语言:C/C++,但我想所有其他语言都是一样的.
PS我个人认为答案是(x < 0).
更广泛的大师:如果x从-1到2^30?
Ada*_*eld 78
这完全取决于您正在编译的ISA以及编译器优化器的质量.不要过早优化:首先找到您的瓶颈.
也就是说,在x86中,你会发现在大多数情况下两者都同样快.在这两种情况下,您都将有一个比较(cmp)和一个条件跳转(jCC)指令.但是,对于(x < 0)某些情况,编译器可能会忽略该cmp指令,从而将代码加速一整个周期.
具体来说,如果该值x存储在寄存器中并且最近是算术运算的结果(例如add,或者sub,但是,还有更多可能性)在EFLAGS寄存器中设置符号标志SF,那么就不需要该cmp指令,编译器只能发出一条js指令.jCC当输入为-1时,没有简单的指令跳转.
GMa*_*ckG 23
为什么?无论您做什么,编译器都会在您当前正在编译的任何平台上对其进行优化.
如果你需要检查它是否为-1,请使用(x == -1),如果你想知道它是否小于零,请改用它.写下你会大声朗读的内容.
像这样的微小的东西不会让任何事情变得更快,你应该担心可读性和干净的设计,而不是哪个微小的操作更快.
即使它没有做任何逻辑更改,机会在您的平台上,两者都将在一个CPU周期内执行.
Ale*_*man 11
试试看吧!做一百万甚至更好,每个十亿,并计时.我敢打赌,你的结果没有统计意义,但谁知道 - 也许在你的平台和编译器上,你可能会找到一个结果.
这是一个很好的实验来说服自己,过早的优化可能不值得你花时间 - 而且可能是" 所有邪恶的根源 - 至少在编程中 ".
这两个操作都可以在一个CPU步骤中完成,因此它们应该具有相同的性能.
它可能取决于比较之前或之后的操作.例如,如果在进行比较之前将值赋给x,则检查符号标志可能比比较特定值更快.或者CPU的分支预测性能可能会受到您选择的比较的影响.
但是,正如其他人所说,这取决于CPU架构,内存架构,编译器和许多其他东西,因此没有一般性的答案.
x <0会更快.如果没有别的,它会阻止将常量-1作为操作数获取.大多数架构都有特殊的指令用于比较零,所以这也有帮助.