2017-05-17 65 views
1

我已經使用JSperf來測試code的小樣本。函數聲明和函數表達式性能差異

enter image description here

據我碰到了幾篇文章,都應該有有一個小的邊緣test2的類似的性能。但這裏完全相反。有人可以解釋爲什麼巨大的差異?

編輯:我也明白他們之間的差異。請不要將其標記爲this或討論語義差異的其他問題的重複,也不要回答我關於表現的問題。

謝謝。

+0

如何將我們鏈接到實際測試用例? – Cerbrus

+0

@Cerbrus加入了測試鏈接 –

+0

誰downvoted,你可以請說明原因嗎?將有助於提出更好的問題 –

回答

1

隨着JavaScript引擎目前使用的強大優化功能,像這樣的微基準測試產生了一些令人誤解的結果。例如,我猜你正在測試的是函數調用開銷。但它看起來像你的代碼寫入的方式,你可能(重新)每10次執行一次就定義一次函數定義和/或符號查找; 我猜這不是意圖。

this alternative test中,我安排了一些事情以避免函數的重複定義,並添加了一些調用函數的其他方法。這減少了我認爲由實驗性噪音支配的性能差異。雖然這有時可能會有明顯的差異,但我不會認爲它們具有統計顯着性,因爲它們具有實驗誤差水平。換句話說,它將比賽減少到虛擬領帶。

即使在兩種方法之間存在一致差異的瀏覽器中,將函數緩存在局部變量中似乎可以最小化定義和表達式之間的差異。

1

我也明白他們之間的差異。

你也理解these semantic differences

請注意,jsPerf會將您的代碼置於一個執行時間被測量的緊密循環中。函數聲明需要爲每個迭代創建一個塊範圍,這會顯着降低測試速度。這不是你想要衡量的。

+0

同意。出於同樣的原因,*引擎之間的明顯差異*在微觀基準測試中遠高於真實世界的使用情況。 jsPerf測量的差異因子不一定意味着對典型應用程序有任何意義。 –

+0

@Bergi你的意思是'函數聲明*需要*創建一個塊範圍'?每個循環都不會引入自己的塊範圍嗎?或者你的意思是沒有聲明的塊範圍是'空',可以優化掉嗎? –

+0

@ie_m,我懷疑塊範圍可以按寫入的方式進行優化,它包含被調用函數的函數定義。 –