Google chrome 为什么native.bind()这么慢?

Google chrome 为什么native.bind()这么慢?,google-chrome,bind,Google Chrome,Bind,我最近遇到了这个问题。对于我正在从事的一个项目,我们使用.bind()的方式太频繁了,考虑到渲染循环只有16毫秒的时间,它实际上严重影响了性能 所以我做了一些jsperf,并注意到调用绑定函数(除了额外的垃圾)要比调用未绑定函数或对函数使用.call慢得多 我确实更改了每一段代码,以避免绑定,并改为使用.call/.apply。为此,我不仅生成了较少的功能,而且还大大提高了我的应用程序的性能 然而,我对此并不满意,并编写了一种绑定函数的新方法。 这将使用.call/.apply方法覆盖本机绑定

我最近遇到了这个问题。对于我正在从事的一个项目,我们使用.bind()的方式太频繁了,考虑到渲染循环只有16毫秒的时间,它实际上严重影响了性能

所以我做了一些jsperf,并注意到调用绑定函数(除了额外的垃圾)要比调用未绑定函数或对函数使用.call慢得多

我确实更改了每一段代码,以避免绑定,并改为使用.call/.apply。为此,我不仅生成了较少的功能,而且还大大提高了我的应用程序的性能

然而,我对此并不满意,并编写了一种绑定函数的新方法。

这将使用.call/.apply方法覆盖本机绑定方法。 它的运行速度提高了96%

在nodejs上进行一些测试可以得到以下结果: 调用绑定函数比调用未绑定函数慢20倍。 用我自己的方法调用绑定函数只需要未绑定调用的2倍时间

所以我想知道本机绑定函数有什么问题。为什么会这样?那将是处理这一问题的最佳方式

我的大部分应用程序代码现在都是这样写的:

var scope=this;

this.boundFn=函数(a,b,c){return scope.fn(a,b,c);}我的猜测是,它克隆了您正在使用的对象,但替换了对象的底层原型。现在需要做两件事,而不是使用页面呈现代码中的通用预编译对象:

传递的变量将在此处出现。分析它,克隆它。然后将要调用的指定函数注入新对象。然后在新对象中执行该函数。之后如果不再叫它清理

对象的范围循环越复杂,绑定所需的时间就越长,因为引擎需要遍历所有函数和参数的范围树,以查看需要复制的内容

您已经在使用作用域,我强烈建议您这样做。它的内存占用较少,引擎不必复制对象,然后调用函数。您还可以从这两个对象访问属性

根据我的经验,装订从来都不是真正需要的。只需对属性使用setter和getter,否则作用域变量在主对象中不会总是更改

以这个片段为例

函数domagic(){
this.myproperty=“Hello”;
}
domagic.prototype={
执行:函数(){
var=这个;
var hello=“World”;
setTimeout(函数(){
//此上下文中的这是运行超时的内容,而不是domagic
//我将其用于jQuery和我自己的对象,以获得最佳效果
//但我总是在一个范围内发表评论
//提醒自己这个和那个指的是什么。
window.alert(that.myproperty+hello);
那。集(“再见”);
},2000);
},
设置:功能(什么){
this.myproperty=what;
}
};
magic=新的domagic();
magic.perform();

setTimeout(函数(){magic.perform();},2000)
。调用
。应用
据我所知,对
这个
关键字和上下文做一些非常不同的事情。如果您正在避免使用
这个
关键字,那么您应该没问题。但是,警告一句,您正在创建的lambda正在创建闭包,如果您不小心,可能会泄漏内存(函数引用了
范围
)。