2013-08-20 110 views
7

我在http://www.jquery4u.com/javascript/shorthand-javascript-techniques/上看到一篇帖子,他談到了使用switch語句的另一種方法。JSON喜歡語法vs switch語句javascript

我已經在下面創建了一個代碼片段,但我不確定爲什麼替代品的速度慢了99%。

function doX(){} 
function doY(){} 
function doN(){} 
var something = 1; 

var cases = { 
    1: doX, 
    2: doY, 
    3: doN 
}; 
if (cases[something]) { 
    cases[something](); 
} 

http://jsperf.com/alternateswitch

任何想法?

+0

就像他談論的if/else的簡寫版本一樣,它更短,但它不會更快。 –

+2

「JSON」語法只是一個對象。 – Blender

+6

我也認爲你在結果上的差異很大一部分是濫用jsperf。確保將任何一個時間代碼添加到測試的設置部分。以下是使用您的代碼的示例:http:// jsperf。com/alternateswitch/3 –

回答

3

作者從未聲稱較短的代碼,它只是可能情況下的散列圖,實際上會更快。顯然,在測試套件中運行時,陣列創建會對性能產生負面影響。與此同時,switch語句是編譯代碼。

如果您的代碼正在被重用,您將看到一些改進,即您保留cases的值;我在​​中測量了大約20-30%的差異,這取決於哪種情況更頻繁發生。這就是說,除非你的代碼是在一個嚴密的循環中運行,否則這種孤立的性能測試將不會有用,因爲測試用例在我的家用計算機上以每秒50M +的操作運行。因此,兩者之間的差異應基於其他因素,例如代碼清晰度或事實上,如果您忘記放置break;聲明,則聲明很容易混淆。

+0

您的測試案例不公平。你正在做關聯數組查找兩次。 – invisal

+0

@invisal這是原始代碼,沒有額外的查找,代碼嚴格地與「switch」不同。 –

7

「JSON」語法只是一個對象。此外,您的比較在這裏有點不公平,因爲您在每個定時循環創建一個全新的對象,這有點貴。

如果您移動對象創建的設置部分中,數差neglibile:http://jsperf.com/alternateswitch/4

如果刪除if聲明,對象將是一個稍快一點(至少對我來說):http://jsperf.com/alternateswitch/5。額外的財產查詢和真實性檢查確實減慢了速度。

3
  • 我相信Javascript對象是一個關聯數組,其中 通常實現爲一個哈希表。每次查找都需要一個密鑰通過散列函數去 。散列功能就像是一個雙刀片。對於小尺寸的數據,它會比if-elseif-else慢。然而,對於更大的數據,它將勝過普通的if-elseif-else
  • 你贊成switch是非常不公平的,你讓你正在尋找的變量是第一種情況。因此,switch的複雜度爲O(1),供您測試。
+1

呵呵,我從來不會猜到switch語句中的case的順序實際上對性能有很大的影響:http://jsperf.com/alternateswitch/8 – Blender

+0

開關的代碼複雜度總是爲O(1)順便說一句:) –

+0

@Jack,如果你有N個案例,交換機的複雜性並不總是O(1)。我相信Javascript中的'switch'與if-else類似,而不是跳轉表。 – invisal

1

通常switch語句被編譯器/解釋器優化。他們甚至比鏈接if-else陳述更快。通過使用JSON對象而不是switch語句,您將繞開Javascript引擎優化。