我正在观看一场NodeJS互动式演讲,而那个人说的是匿名功能是如何糟糕的原因之一是,如果他们没有名字,VM无法根据其使用频率来优化功能,因为它无名。 / p>
因此,如果调用具有名称的函数
random.Async('Blah', function randomFunc() {});
randomFunc
可以像以下函数一样进行优化:
random.Async('Blah', function(cb) {});
这不会被优化,因为它是匿名的,无名的。
所以我想知道箭头函数是否会做同样的事情,因为我认为你不能命名箭头函数。
威尔
random.Async('Blah', (cb) => {});
会进行优化吗?
编辑:寻找链接到该人提到的谈话,将报告回来。 (这次谈话是从不久前开始的,这是我记得的一件事)
答案 0 :(得分:1)
我相信Matteo所指的是几次被调用的函数(例如只调用一次的回调),而v8优化与函数是否实际上是匿名无关。
另外,如果你继续观看,他提到使用一个名为reusify
的模块,该模块基本上提供了一系列功能。通过使用它,这意味着您可以从池中获取可能已经优化的功能,这意味着可以执行比典型的一次性使用回调更快。然而,并非所有用例都可以使用这样的东西。
答案 1 :(得分:1)
注意,不完全确定这些是链接视频演示中讨论的模式比较。
在10000次迭代中,命名函数似乎在铬的V8实现时完成得最快。 Arrow function
似乎以比匿名函数更短的时间返回结果。
在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/