2015-11-07 32 views
2

好吧,雖然我嵌套一些驗證,如果,我已經談到性能。什麼是更快?兩個比較或一個比較與一個邏輯檢查?

讓我們假設我驗證票的節目,我可以做這樣的事情:

var validateVipTicket = function (ticketInfo) { 
    if (ticketInfo.isPaid) { 
    if (ticketInfo.isOver16) { 
     if (ticketInfo.isVip) { 
     return true; 
     } else return 'Not Vip'; 
    } else return 'Not old enought'; 
    } else return 'Need to pay first'; 
}; 

,並調用它像這樣validateVipTicket({isPaid: true, isOver16: true, isVip: true});

讓我們假設並不重要指定發生了什麼錯誤,我只是想要一個真或假,然後,什麼方法會更快?

if (ticketInfo.isPaid) { 
    if (ticketInfo.isOver16) { 

OR

if (ticketInfo.isPaid && ticketInfo.isOver16) { 

第一種情況,第一個屬性將被選中,當它完成,第二個屬性將被檢查。在第二種情況中,第一個屬性將被檢查,第二個屬性將被檢查,並且它們兩個屬性將相互比較。這是正確的嗎?我錯過了什麼嗎?哪個更快,爲什麼?

回答

1

這沒有什麼區別:

if (a && b) 

相同

if (a) 
    if (b) 

a && b的情況下,只要a發現錯誤,那麼就什麼都無所謂b是。

在兩種情況下,CPU指令級會發生什麼事是:

cmp [a], 0 ; a == 0? (it does this by calculating a - 0) 
jz false1 ; jump if result is zero 
; a is true 
cmp [b], 0 
jz false2 
; both a and b are true 

無論是3個不同的郵件將被退回,或僅有1,可以有所作爲的速度,這取決於它是如何編譯。在這個例子中,它沒有什麼區別:

false1: return "not a!"; 
false2: return "not b!"; 

just_false: return false; 

但在這裏,轉到涉及額外的跳/:

false1: result = "not a!"; goto done; 
false2: result = "not b!"; // goto done optimized away 
done: return result; 
+0

「CPU發生了什麼」。好點子。低級別是一個很好的解釋。 – Rodmentou

1

2條語句在性能上是等價的。在這兩種情況下,第二次檢查(ticketInfo.isOver16)僅在第一次檢查(ticketInfo.isPaid)返回true時才被評估。這兩種說法在速度上完全相同。所以你應該更喜歡那些對你更可讀的。

1

現代JS引擎如V8的性能是相同的。儘管蹩腳的解釋程序總是比其他程序執行得更好,但使用現代瀏覽器和JIT編譯器(例如V8),您應該會得到相同的結果。

概念證明: http://jsperf.com/nested-conditionals-vs-inline

2

在第二種情況下,第一屬性將被檢查,第二 屬性將被檢查,並且它們,這兩種性質進行比較 彼此抵靠。這是正確的嗎?

不,這其實並不正確。 &&運算符執行short-circuit evaluation,這意味着如果第一個操作數計算結果爲false,則不會評估第二個操作數。

這使得兩種方法完全相同(即使有任何副作用評估的oparands)。由於他們以相同的方式完成相同數量的工作,因此可以預期性能非常相似。這些方法最終最終會生成相同的可執行代碼。