crockford的JavaScript构造函数模式真的应该更快吗?
Is crockford's JavaScript constructor pattern really supposed to be faster?
我最近尝试为一个经常创建的值对象优化一些代码。(三维矢量,流)
我尝试的一件事是将构造函数从匿名方法工厂模式转换为普通的JavaScript构造函数。
这导致了严重的性能损失,这让我很惊讶,因为在我上一个关于JavaScript构造函数/工厂模式的问题中,我强烈建议使用'new'和normal构造函数。
很可能是我的测试太简单了,或者只是简单的错误,或者是最近在chrome的JavaScript引擎中进行的性能优化的结果,或者以上所有。在任何情况下,我真的很想知道为什么我的"优化"导致性能下降-最重要的是:我的jsperf测试是否有任何明显的问题?
您的测试之间的主要区别是:
-
{}
比new Object
快得多,这表明new
比{}
慢。([]
和new Array
也是如此) -
您的测试产生不同的结果:您的
make
工厂函数的结果不是Make
对象。构造的Make
有一个原型,由所有Make
对象共享。你的工厂函数的结果只是一个裸Object
,并且在它的原型链(Object.prototype
)中有一个原型,而Make构造对象有两个(Make.prototype
,然后是Object.prototype
)。我做了你的测试的一个分支,用一个工厂函数,实际上返回一个
Make
对象(而不是一个简单的Object
),使用非标准的__proto__
属性,它比使用构造函数慢得多。IE不支持__proto__
,但是Firefox和Chrome的结果看起来非常明确。
构造函数优化的目的之一是共享属性,通常是方法。如果许多对象使用相同的函数作为方法,或共享其他命名属性,那么对原型的赋值将在从构造函数创建的所有对象中共享该属性的单个实例,从而减少内存开销,并且不需要为每个创建的对象重复分配每个此类属性,从而减少构造时间开销。
由于您的示例不包含任何此类属性,因此您将看不到此类好处。但是,如果您的产品代码不包括您构造的对象的共享属性,则可能没有理由切换到构造函数。
那么,如果,例如你有这样的代码:
function make(p) {
return {
parm: p,
addTwo: function() {return this.parm + 2;},
double: function() {return this.parm * 2;},
square: function() {return this.parm * this.parm;}
};
};
它可能会运行得比这更慢:
function Make(p) {
this.parm = p;
}
Make.prototype.addTwo = function() {return this.parm + 2;};
Make.prototype.double = function() {return this.parm * 2;}
Make.prototype.square = function() {return this.parm * this.parm;}
- coffescript/javascript函数数组的行为真的很奇怪
- 在 JavaScript 中真的需要提升以实现相互递归吗?
- Java/JavaScript日期:这是真的吗
- 为什么使用Javascript''=='0'为false,但0==''是真的
- 一个Javascript回调模式示例 - 它真的更有效吗?
- 检测 Javascript 变量是否真的未定义
- 添加参数时调用javascript函数停止工作,这真的不大声吗
- 在 JavaScript 中是 -1 真的
- JavaScript的“返回”真的是一个*关键字*吗?
- 在Javascript中构建HTML字符串真的不安全吗?
- Cookies,JavaScript,Python,浏览但不是真的
- 当代码可用时,Javascript中的eval真的有安全风险吗
- JavaScript检查一个对象数组的结果是错误的,而它应该是真的
- 真的有什么方法可以通过javascript区分android MOBILE chrome和android TABLET
- 如何(真的!)使JavaScript异步调用同步(在Chrome上)
- 我真的需要在javascript ES6类中使用setter/getter吗
- Javascript中的回调真的是方法调用吗?如果是的话,他们是怎么回事'级联'
- 数组真的是“分隔”的吗?默认情况下在JavaScript中
- 在所有主流浏览器中,GIF动画和javascript在同一个线程上运行,这是真的吗?
- 如何播放声音,如果条件成真的javascript