javascript - 函数初始化位置之间的性能差异 [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);
惊奇
推荐阅读
- javascript - 如何为平滑滚动添加缓动?
- python - 如何使用 asyncio 迭代阻塞迭代器?
- git - 在 GitAhead 中,无法使用上游创建新分支
- amazon-web-services - 如何在作为 AWS Lambda 代理的一部分的 Micronaut API 实施中获取“requestContext”数据
- c# - 从站点读取 RSS 提要并使用 C# 显示其中的 HTML 内容
- ios - 在不关闭键盘的情况下在文本字段之间切换时 Xcode 约束中断
- android - 没有连接到存储库的活动是否应该具有 ViewModel?
- git - git如何决定何时存在合并冲突?
- python - 在 c 扩展中返回 numpy 数组会导致分段错误:11
- javascript - 如何仅在用户登录时运行 ajax。(Django)