首页 > 解决方案 > 函数初始化位置之间的性能差异 [JavaScript]

问题描述

我很好奇在循环外初始化函数与内联函数之间的性能差异:

循环外:

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

largeArray.reduce(reducer);

排队:

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

我经常遇到这种情况,除非我要重用该函数,否则使用内联版本避免将另一个变量引入我的范围似乎很有用。

这两个示例是否存在性能差异,或者 JS 引擎是否对它们进行了相同的优化?

例如:是否每次循环运行时都会创建内联函数然后进行垃圾收集?如果是这样:

是否还有其他差异或我没有考虑的事情?

希望你能理解我的思路,并能对此提供一些见解。我意识到我可以阅读 V8 或其他引擎的所有文档和源代码,并且我会得到答案,但理解这个概念似乎是一项艰巨的任务。

标签: javascriptparsingoptimizationinitialization

解决方案


我确实在 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);

惊奇


推荐阅读