2010-09-29 40 views
1

測試在這裏:http://jsperf.com/test-for-speed-of-various-conditionals爲什麼Safari會在這裏提供幾乎相反的結果?

我有興趣,如果別人所得到的是同樣的結果,而人們可能會想到爲什麼結果不同的瀏覽器不同(ESP W/Safari瀏覽器。)什麼。有趣的是火狐瀏覽器處理各種情況的民主化程度。

請告知,如果有什麼可怕的錯誤與我的方法:)

火狐3.6/Mac OSX版10.64: 開關= 824352個OPS /秒​​(14%速度較慢)
的if/else = 530062(44%慢,最慢)
散列/懶惰= 968035(最快)
散列/的if/else = 963765(0%較慢)

鉻6.0.472.63/Mac OSX 10.64:
開關= 10220039個操作/秒(慢62%)
如果/否則= 7744284(71%較慢,最慢)
散列/懶惰= 27130039(最快)
散列/的if/else = 25297370(6%較慢)

的Safari 5.0.2/Mac OSX上10.64:
開關= 15044132個操作/秒(最快)
如果/否則= 1793051(88較慢%,最慢)
散列/懶惰= 10381941(較慢30%)
散列/如果較慢/否則= 11119576(26% )

Opera 10.10/Mac OSX 10.64:
開關= 497238個OPS /秒​​(慢32%)
如果/否則= 250904(66%較慢,最慢)
散列/懶惰= 740520(最快)
哈希/如果(較慢14%)/否則= 634424

MSIE 8.0/Windows NT中:
開關= 176267個操作/秒(60%較慢)
如果/否則= 124783(72較慢%,最慢)
散列/懶惰= 447421(最快)
哈希/ if/else = 442,736(14%較慢)

+0

又是什麼問題? – spender 2010-09-29 19:00:00

+0

一般的建議是不使用switch(),而是選擇某種查找。除了Safari之外,所有瀏覽器都提供了這個建議 - 其中交換機實際上是最快的,大幅度減少。我首先想知道我是否產生了幻覺,其次,如果有人知道這是爲什麼(尤其是Chrome沒有出現這種行爲)。 – 2010-09-29 19:06:05

+0

儘管Chrome和Safari都使用WebKit進行渲染,但它們具有不同的JavaScript引擎(V8 for Chrome和Nitro for Safari)。 – Chuck 2010-09-29 20:35:38

回答

2

Javascript有一個規範但它沒有定義實現;這取決於瀏覽器供應商決定如何實現規範(這也導致了大量的跨瀏覽器問題,儘管它們近來有所改進)。很可能各種瀏覽器實現您使用的各種方法的方式不同。

0

這些都不是很公平的測試。直接查找速度更快的原因是因爲每個其他測試都會在條件檢查之上進行完全相同的查找。而且也沒有真正的理由寫這樣的代碼:

if (t == 'e') c['e']; 

這是一個明顯違反DRY(不要重複自己),而你不會使用一個字符串在查找的內容文字保存任何時間變量t仍然必須被提取用於比較。

而且

if (c[t]) c[t](); 

只是很懶,

c[t] && c[t](); 

至於爲什麼Safari瀏覽器提供了這樣相反的結果,我也沒辦法,因爲這是不符合邏輯的「操作+ b動作操作a「。應該指出的是,JavaScript中的性能測試通常是不可靠的,因爲Date對象被限制爲毫秒,即使這樣通常也不能提供足夠的有效結果準確性。

最後,在其他所有條件相同的情況下,對象查找是從來沒有比if/else或switch語句更快,實際上可能會慢幾個數量級。 if/else和switch之間的區別如果存在的話也應該可以忽略不計,並且當然高度依賴於特定的瀏覽器/解釋器。

+0

謝謝大家。來自另外兩個測試的其他一些筆記,其中一個筆記本有一個較小的集合,另一個筆記在第一個實例存在真值條件。在較小的設置中,除了Firefox之外,其結果保持不變,使用switch()突然更快。當我找到第一個結果('a'而不是'g')時,可以預見的是,在所有瀏覽器中開關速度都更快,*但懶惰評估是散列技術中速度最慢的*看起來第二個散列查找速度最快w /小集):(1)http://jsperf.com/simpler-conditional-test; (2)http://jsperf.com/simpler-conditional-test-first-case – 2010-09-29 21:48:18

相關問題