gpt4 book ai didi

Javascript 原型(prototype)运算符性能 : saves memory, 但速度更快吗?

转载 作者:IT王子 更新时间:2023-10-29 03:03:15 24 4
gpt4 key购买 nike

我读了here (Douglas Crockford)使用原型(prototype)运算符向 Javascript 类添加方法还节省内存

然后我读入this John Resig's article “用一堆原型(prototype)属性实例化一个函数非常非常快,但他是在谈论以标准方式使用原型(prototype),还是在谈论他的他文章中的具体例子?

例如正在创建这个对象:

function Class1()
{
this.showMsg = function(string) { alert(string); }
}
var c = new Class1();
c.showMsg();

创建这个对象慢吗?

function Class1() {}
Class1.prototype.showMsg = function(string) { alert(string); }
var c = new Class1();
c.showMsg();

附言

我知道原型(prototype)用于创建继承和单例对象等。但是这个问题与这些主题没有任何关系。


编辑:可能对 JS 对象和 JS 静态对象之间的性能比较 感兴趣的人可以阅读 this answer below . 静态对象肯定更快,显然只有当您不需要多个对象实例时才可以使用它们。

最佳答案

2021 年编辑:

这个问题是在 2010 年提出的,当时 class 在 JS 中不可用。如今,class 已经优化到没有理由不使用它。如果您需要使用new,请使用class。但是回到 2010 年,当将方法绑定(bind)到它们的对象构造函数时,您有两种选择——一种是使用 this 在函数构造函数内部绑定(bind)函数,另一种是使用 prototype 在构造函数外部绑定(bind)它们。 @MarcoDemaio 的问题有非常简洁的例子。当 class 被添加到 JS 时,早期的实现在性能上很接近,但通常更慢。这不再是事实了。只需使用 class。我想不出今天使用 prototype 的理由。


这是一个有趣的问题,所以我运行了一些非常简单的测试(我应该重新启动浏览器以清除内存,但我没有这样做;物有所值)。看起来至少在 Safari 和 Firefox 上,prototype 运行速度明显更快 [编辑:不是前面所说的 20 倍]。我敢肯定,使用功能齐全的对象进行真实世界测试会是更好的比较。我运行的代码是这样的(我分别运行了几次测试):

var X,Y, x,y, i, intNow;

X = function() {};
X.prototype.message = function(s) { var mymessage = s + "";}
X.prototype.addition = function(i,j) { return (i *2 + j * 2) / 2; }

Y = function() {
this.message = function(s) { var mymessage = s + "";}
this.addition = function(i,j) { return (i *2 + j * 2) / 2; }
};


intNow = (new Date()).getTime();
for (i = 0; i < 10000000; i++) {
y = new Y();
y.message('hi');
y.addition(i,2)
}
console.log((new Date()).getTime() - intNow); //FF=5206ms; Safari=1554

intNow = (new Date()).getTime();
for (i = 0; i < 10000000; i++) {
x = new X();
x.message('hi');
x.addition(i,2)
}
console.log((new Date()).getTime() - intNow);//FF=3894ms;Safari=606

真可惜,因为我真的很讨厌使用prototype。我喜欢我的目标代码是 self 封装的,不允许漂移。不过,我想当速度很重要时,我别无选择。该死的。

[编辑] 非常感谢@Kevin,他指出我之前的代码是错误的,大大提高了prototype 方法的报告速度。修复后,原型(prototype)仍然明显更快,但差异没有那么大。

关于Javascript 原型(prototype)运算符性能 : saves memory, 但速度更快吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3493252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com