这实际上只是一个学术问题,我只是想知道哪个更快。我猜差异可以忽略不计,但我还是想知道。
if( (x == 1) || (x == 2) )
对比
if (x < 3)
谢谢!
这实际上只是一个学术问题,我只是想知道哪个更快。我猜差异可以忽略不计,但我还是想知道。
if( (x == 1) || (x == 2) )
对比
if (x < 3)
谢谢!
在您提供的表格中,复杂性存在明显差异:第一个代码使用 3 个运算符,然后是第二个 - 仅一个。但是好的,让我们把这段代码放在并假设你想比较>
(或<
)和==
(!=
)。如果您在检查程序时遇到过汇编程序(但我打赌您没有),您会注意到这样的代码
if (x < 3) /* action */;
被翻译成类似的东西(对于x86 CPU):
cmp %eax, 3 // <-- compare EAX and 3. It modifies flags register(*1) (namely ZF, CF, SF and so on)
jge @@skip // <-- this instruction tells CPU to jump when some conditions related to flags are met(*2).
// So this code is executed when jump is *not* made (when x is *not*
// greater or equal than 3.
/* here is action body */
@@skip:
// ...
现在考虑这段代码:
if (x == 3) /* action */;
它将给出几乎相同的程序集(当然,它可能与我的不同,但在语义上没有区别):
cmp %eax, 3
jne @@skip // < -- here is the only difference
/* action is run when x is equal to 3 */
@@skip:
...
这两个运算符(jge
和jne
其他跳转)都以相同的速度完成它们的工作(因为 CPU 是这样制造的,但这显然取决于它的架构)。对性能的影响更大的是跳转距离(代码位置之间的差异)、缓存未命中(当处理器错误地预测跳转时)等等。有些指令甚至更有效(例如使用更少的字节),但请记住唯一的一点:不要对它们给予太多关注。进行算法优化总是更好,不要节省匹配。让编译器为你做——在这类问题上它确实更胜任。专注于你的算法、代码可读性、程序架构、容错性。让速度成为最后一个因素。
(*1): http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29
(*2): http://www.unixwiz.net/techtips/x86-jumps.html