这实际上只是一个学术问题,我只是想知道哪一个更快。我猜测这种差异可以忽略不计,但我仍然想知道。==运营商的成本vs < or >运营商
if((x == 1) || (x == 2))
VS
if (x < 3)
的感谢!
这实际上只是一个学术问题,我只是想知道哪一个更快。我猜测这种差异可以忽略不计,但我仍然想知道。==运营商的成本vs < or >运营商
if((x == 1) || (x == 2))
VS
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
而你尝试......?我猜'x <3'会更快,因为它的汇编代码更短。这个问题应该是特定于某种语言的。 – gdoron
这两个条件甚至都不相同。 '0 <3'但是'!((0 == 1)||(0 == 2))'。 –
耶拉斯曼和-345也<3。为什么会这么重要?为什么你认为x有可能具有比1,2,3,4或5更多的其他值?在这种情况下,这些陈述完全相同...... – Vincent