最近,我尝试为一个经常创建的值对象优化一些代码。(三维矢量,fwiw)
我尝试过的一件事是将构造函数从匿名方法工厂模式转换为普通的JavaScript构造函数。
这导致了一个令我惊讶的severe performance penalty,因为在我的last question中关于JavaScript构造函数/工厂模式的主题非常推荐使用'new‘和普通构造函数。
这很可能是我的测试过于简单,或者是完全错误的,或者是最近在chrome的JavaScript引擎中进行的性能优化的结果,或者以上所有的结果。无论如何,我真的很想知道为什么我的“优化”会导致性能下降--最重要的是:我的jsperf测试有什么明显的问题吗?
发布于 2013-01-03 04:29:04
构造函数优化的一件事是共享属性,通常是方法。如果许多对象使用与方法相同的函数,或者共享其他命名属性,则对原型的一次赋值将在从构造函数创建的所有对象之间共享属性的单个实例,从而减少内存开销,并且不需要为每个创建的对象重复分配每个此类属性,从而减少构造时间开销。
由于您的示例不包含任何此类属性,因此您不会看到这些好处。但是,如果您的生产代码不包含构造对象的共享属性,则很可能没有理由切换到构造函数。
例如,如果您有代码like this
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;}如果你创建了很多实例,也会占用更多的内存。
发布于 2013-01-03 04:31:03
测试之间的主要区别是:
{} is way faster than new Object,,这表明new只是比使用{}慢而已。( new Array.)[]也是如此:make工厂函数的结果不是Make对象。构造的Make有一个由所有Make对象共享的原型。工厂函数的结果只是一个空的Object,并且在其原型链(Object.prototype)中只有一个原型,而Make构造的对象有两个(Make.prototype,然后是Object.prototype)。我用一个工厂函数创建了一个fork of your test,它实际上返回一个Make对象(而不是一个简单的Object),使用非标准的__proto__属性,它比使用构造函数慢得多。IE不支持__proto__,但火狐和Chrome的结果看起来相当明确。
https://stackoverflow.com/questions/14125373
复制相似问题