簡體   English   中英

函數初始化位置之間的性能差異[JavaScript]

[英]Performance difference between function initialization locations [JavaScript]

我對循環外初始化與內聯初始化之間的性能差異感到好奇:

循環外:

const reducer = (acc, val) => {
  // work
};

largeArray.reduce(reducer);

排隊:

largeArray.reduce((acc, val) => {
  // work
});

我經常遇到這種情況,除非我要重用該函數,否則避免使用內聯版本將另一個變量引入我的作用域似乎很有用。

這兩個示例在性能上是否存在差異,或者JS引擎是否對它們進行了相同的優化?

例如:是否在每次循環運行時創建內聯函數,然后進行垃圾回收? 如果是這樣:

  • 這會對性能產生什么樣的影響,並且
  • 函數的大小是否會對此產生影響? 例如,一個200與30_000 Unicode字符的函數。

還有其他差異或我不在考慮的事情嗎?

希望您理解我的思路,並可以對此提供一些見識。 我意識到我可以閱讀V8或其他引擎的所有文檔和源代碼,並且可以得到答案,但這似乎是理解該概念的一項艱巨任務。

我確實在jsben上進行了測試

SET1(隨機使用兩次): http : //jsben.ch/8Dukx

SET2 :(使用一次): http : //jsben.ch/SnvxV

設定

const arr = [ ...Array(100).keys() ];
const reducer = (acc, cur) => (acc + cur);

測試1

let sumInline = arr.reduce((acc, cur) => (acc + cur), 0);
let sumInlineHalf = arr.slice(0, 50).reduce((acc, cur) => (acc + cur), 0);

console.log(sumInline, sumInlineHalf);

測試2

let sumOutline = arr.reduce(reducer, 0);
let sumOutlineHalf = arr.slice(0, 50).reduce(reducer, 0);

console.log(sumOutline, sumOutlineHalf);

驚奇

這會對性能產生什么樣的影響,並且

沒有。

函數的大小是否會對此產生影響? 例如,一個200與30_000 Unicode字符的函數。

函數不會作為“ unicode字符”執行。 代碼有多“長”無關緊要。

還有其他差異或我不在考慮的事情嗎?

一個非常重要的代碼:代碼是為人類而不是計算機編寫的。 為什么還要問我?

每次循環運行時都會創建內聯函數,然后再進行垃圾回收嗎?

那將是不必要和緩慢的。 大概吧:不。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM