2012-12-19 33 views
7

尋找方法來驗證我的代碼,我遇到this jsPerf test。除了讓我對函數調用緩慢的概念重申以外,沒有其他的預期,我用IE 9的結果真的讓我陷入循環。使用函數調用的代碼是更快,但只在這一個瀏覽器上。我用相同的結果多次運行它。我看不到測試設置不正確。什麼可能導致這個奇怪的結果?通過函數調用,IE的運行速度更快?

我的用戶代理是Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0的Windows服務器上運行的2008

+0

奇數,IE 10也沒有這樣做。 – vcsjones

+0

剛剛確認它只是一個IE 9的東西。在另一臺電腦上再次嘗試。 –

+1

標籤進程是32位還是64位?腳本調試是啓用還是禁用?是否有區別,如果你曾經使用*結果*的測試(例如,防止優化整個事情) – EricLaw

回答

4

免責聲明:我的jsPerf.com的創造者。


你的第一個考驗就是以下幾點:

var i = 0; 
for (i = 0; i < 1000; i++) { 
    test() 
} 

爲什麼包括for循環呢?它只會扭曲結果。 jsPerf會自動重複測試代碼,直到執行足夠的測試以獲得統計意義的結果。理想情況下,jsPerf測試儘可能的緊湊,只測試你真正想測試的東西。在這種情況下,你根本不感興趣的是for循環性能 - 你只是想知道內聯代碼是否比調用函數快。

如果您對創建穩健的jsPerf測試用例的其他提示感興趣,check out my #jsconfeu2011 presentation

注意:我並不是說多餘的for循環就是您看到這個結果的原因。這可能是一個因素,但可能會有其他的東西進一步扭曲結果。 This might be IE9’s 「dead code removal」 feature kicking in.

無論如何,我已經分叉了您的jsPerf測試,刪除了循環,並將變量設爲全局變量以避免死代碼優化。 http://jsperf.com/function-calls-vs-inline/3你可以在IE9中測試這個嗎?目前我沒有IE9虛擬機。

+0

我目前無法使用IE9訪問我的機器,但也許更奇怪的是,Chrome現在也可以通過函數調用更快地運行。 –

+0

@TreyKeown:有趣的是,我可以在Chrome 28中重現結果,但不能在Chrome 30 Canary中重現。它可能是Chrome 28附帶的v8版本中的一種僥倖。類似的事情發生了一段時間 - 在某些時候,執行範圍查找比在v8中執行範圍查找更快:http://jsperf.com/範圍的查找 –