箭头函数是否像命名函数一样进行了优化?
Are arrow functions optimized like named functions?
我在看一个 NodeJS Interactive 演讲,那个人说匿名函数有多糟糕,原因之一是如果他们没有名字,VM 无法根据函数的使用频率优化函数,因为它是无名的.
因此,如果调用具有名称的函数
random.Async('Blah', function randomFunc() {});
randomFunc
可以优化为where函数如:
random.Async('Blah', function(cb) {});
这不会被优化,因为它是匿名的,无名的。
所以我想知道箭头函数是否会做同样的事情,因为我不认为你可以命名箭头函数。
会
random.Async('Blah', (cb) => {});
被优化了?
编辑:寻找 link 那个家伙提到这个的谈话,会报告回来。 (这个演讲是很久以前的事了,只是我从中记住的)
我相信 Matteo 指的是调用次数很少的函数(例如,只调用一次的回调),v8 优化与函数是否真正匿名无关。
此外,如果您继续观看,他提到使用一个名为 reusify
的模块,该模块基本上提供了一个功能池。通过使用它,这意味着您可以从池中获取一个可能已经优化的函数,这意味着它 可以 比典型的一次性使用回调执行得更快。然而,并非所有用例都可以使用这样的东西。
注意,不完全确定这些是链接视频演示中讨论的模式比较。
在 10000 次迭代中,命名函数似乎在 chromium 的 V8 实现中完成得最快。 Arrow function
似乎 return 结果比匿名函数花费的时间更少。
100000次迭代匿名函数在最短时间内完成; 64.51ms
比命名函数少,而箭头函数比命名函数花费 4902.01ms
多时间完成。
var len = Array.from({
length: 100000
})
// named function
function _named() {
console.profile("named function");
console.time("named function");
function resolver(resolve, reject) {
resolve("named function")
}
function done(data) {
console.log(data)
}
function complete() {
console.timeEnd("named function");
console.profileEnd();
return "named function complete"
}
function callback() {
return new Promise(resolver).then(done)
}
return Promise.all(len.map(callback)).then(complete);
}
// anonymous function
function _anonymous() {
console.profile("anonymous function");
console.time("anonymous function");
return Promise.all(len.map(function() {
return new Promise(function(resolve, reject) {
resolve("anonymous function")
})
.then(function(data) {
console.log(data)
})
}))
.then(function() {
console.timeEnd("anonymous function");
console.profileEnd();
return "anonymous function complete"
})
}
// arrow function
function _arrow() {
console.profile("arrow function");
console.time("arrow function");
return Promise.all(len.map(() => {
return new Promise((resolve, reject) =>
resolve("arrow function")
)
.then((data) => {
console.log(data)
})
}))
.then(() => {
console.timeEnd("arrow function");
console.profileEnd();
return "arrow function complete"
})
}
_named().then(_anonymous).then(_arrow)
jsfiddle https://jsfiddle.net/oj87s38t/
我在看一个 NodeJS Interactive 演讲,那个人说匿名函数有多糟糕,原因之一是如果他们没有名字,VM 无法根据函数的使用频率优化函数,因为它是无名的.
因此,如果调用具有名称的函数
random.Async('Blah', function randomFunc() {});
randomFunc
可以优化为where函数如:
random.Async('Blah', function(cb) {});
这不会被优化,因为它是匿名的,无名的。
所以我想知道箭头函数是否会做同样的事情,因为我不认为你可以命名箭头函数。
会
random.Async('Blah', (cb) => {});
被优化了?
编辑:寻找 link 那个家伙提到这个的谈话,会报告回来。 (这个演讲是很久以前的事了,只是我从中记住的)
我相信 Matteo 指的是调用次数很少的函数(例如,只调用一次的回调),v8 优化与函数是否真正匿名无关。
此外,如果您继续观看,他提到使用一个名为 reusify
的模块,该模块基本上提供了一个功能池。通过使用它,这意味着您可以从池中获取一个可能已经优化的函数,这意味着它 可以 比典型的一次性使用回调执行得更快。然而,并非所有用例都可以使用这样的东西。
注意,不完全确定这些是链接视频演示中讨论的模式比较。
在 10000 次迭代中,命名函数似乎在 chromium 的 V8 实现中完成得最快。 Arrow function
似乎 return 结果比匿名函数花费的时间更少。
100000次迭代匿名函数在最短时间内完成; 64.51ms
比命名函数少,而箭头函数比命名函数花费 4902.01ms
多时间完成。
var len = Array.from({
length: 100000
})
// named function
function _named() {
console.profile("named function");
console.time("named function");
function resolver(resolve, reject) {
resolve("named function")
}
function done(data) {
console.log(data)
}
function complete() {
console.timeEnd("named function");
console.profileEnd();
return "named function complete"
}
function callback() {
return new Promise(resolver).then(done)
}
return Promise.all(len.map(callback)).then(complete);
}
// anonymous function
function _anonymous() {
console.profile("anonymous function");
console.time("anonymous function");
return Promise.all(len.map(function() {
return new Promise(function(resolve, reject) {
resolve("anonymous function")
})
.then(function(data) {
console.log(data)
})
}))
.then(function() {
console.timeEnd("anonymous function");
console.profileEnd();
return "anonymous function complete"
})
}
// arrow function
function _arrow() {
console.profile("arrow function");
console.time("arrow function");
return Promise.all(len.map(() => {
return new Promise((resolve, reject) =>
resolve("arrow function")
)
.then((data) => {
console.log(data)
})
}))
.then(() => {
console.timeEnd("arrow function");
console.profileEnd();
return "arrow function complete"
})
}
_named().then(_anonymous).then(_arrow)
jsfiddle https://jsfiddle.net/oj87s38t/