2015-10-14 23 views
0

最近我真的挖成JS性能,和我這個問題,其他導致Javascript Array Performance我這個問題。的JavaScript/JSPerf環流式性能

問題: 使用全局變量循環似乎比迭代使用局部變量更快,任何人都可以向我解釋,爲什麼? ---這只是我在JSPerf理解中的錯誤,但問題2仍然存在,但我想沒有真正的答案,其餘部分已經與@ Igor-Raush在聊天中討論過---或者我想,在JSPerf該測試依然快100倍,那麼基本版本...

  • 我敢肯定它不是局部變量創建

你可以在這裏看到此行爲:http://jsperf.com/fastest-array-loops-in-javascript/420 - 我添加最後兩項測試,但最後一個沒有工作,出於某種原因,所以我刪除其內容

問題2(額外的問題,堅d相關): 爲什麼當你在JSPerf上單獨運行測試時(對於其中的一些),它們的性能始終是完全不同的,而不是一次全部運行? (你可以看到這在while長度測試)


我測試這個,因爲(如果你去我的另一個問題),我不相信循環我的數組應該是慢的,因爲它是,在測試中。

回答

1

問題1

之所以在全球情況下的巨大性能「改善」是你在初始化編寫代碼的全局it = 0。在JSPerf中,每個測試用例都運行多個試驗。第一次運行測試用例時,它將增加全球it,直到它超過arr.length

下一次(和所有後續次)測試用例運行時,條件it < arr.length的計算結果爲false,並且環甚至沒有輸入。這是而不是「While循環,基本」測試案例中的情況,其中var i = 0在每次試驗之前被初始化。

您可以在此Plunker中看到使用全局迭代器變量大約是使用本地變量(打開控制檯查看結果)的兩倍。

問題2

的一個可能原因的性能高方差是運行的所有測試可能導致數組是緩存由後來測試用例運行時間上更接近於CPU。當您獨立運行測試用例時,可能需要訪問內存。對於像for/while迭代那樣基本的內存訪問, 是一個真正的瓶頸。但是,這只是一個可能的解釋。

+0

0123你好,你是完全正確的,完全放棄了我的思想,出於某種原因,我認爲jsperf會「重啓」每次迭代之間所有使用的變量,對我來說很愚蠢,對不起。 (我剛剛檢查過,拆卸在迭代之間不起作用) 2.我明白了,這可以解釋它,但是~300倍加速? 猜測我需要嘗試在另一個問題中找到另一個超慢搜索的解釋,它確實困擾我,運行.get函數會產生非常有前景的結果,但在循環內的測試函數中運行相同的函數(即使只進行一次迭代)也很慢。 – user1494173

+0

當運行「While length--」情況下獨立運行與運行所有測試時,我發現運行速度下降了20-25%。 –

+0

也不要低估由於緩存未命中導致的減速。展示緩存和空間局部性的效果的衆所周知的例子是按順序與反向迭代。看到[Plunker](http://plnkr.co/edit/DBicYo1CAu4xpxVXA6M0?p=preview)。有序的迭代在優化編譯器上更容易緩存,因爲它會將數組的塊預加載到緩存中。我在Chrome中看到的加速大約是〜30k次! –