2012-06-24 139 views
-5

这实际上只是一个学术问题,我只是想知道哪一个更快。我猜测这种差异可以忽略不计,但我仍然想知道。==运营商的成本vs < or >运营商

if((x == 1) || (x == 2)) 

VS

if (x < 3) 

的感谢!

+3

而你尝试......?我猜'x <3'会更快,因为它的汇编代码更短。这个问题应该是特定于某种语言的。 – gdoron

+2

这两个条件甚至都不相同。 '0 <3'但是'!((0 == 1)||(0 == 2))'。 –

+0

耶拉斯曼和-345也<3。为什么会这么重要?为什么你认为x有可能具有比1,2,3,4或5更多的其他值?在这种情况下,这些陈述完全相同...... – Vincent

回答

5

在你提供的表单中,复杂性有明显的区别:第一个代码使用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: 
    ... 

这两个操作员(jgejne和其他跳转)以相同的速度执行他们的工作(因为CPU是这样做的,但显然取决于其架构)。跳跃距离(代码位置之间的差异),缓存未命中(处理器错误预测跳转时)等等对性能的影响越大。有些说明甚至更有效(例如使用较少的字节数),但请记住唯一的事情:不要付出太多的关注。做算术优化总是更好,不要在比赛中节省开支。让编译器为你做 - 它真的更能胜任这类问题。专注于你的算法,代码可读性,程序架构,容错性。使速度成为最后一个因素。

(* 1):http://en.wikipedia.org/wiki/FLAGS_register_%28computing%29
(* 2):http://www.unixwiz.net/techtips/x86-jumps.html

+3

+1表示良好,详细,并且最重要的是正确答案! –

+0

@DavidTitarenco,谢谢) –

+0

非常感谢这个答案的人,这真的很好。 – Vincent