Zaz*_*Zaz 14 javascript performance constructor
我最近尝试为经常创建的值对象优化一些代码.(三维向量,fwiw)
我尝试过的一件事是将构造函数从匿名方法工厂模式转换为普通的JavaScript构造函数.
这导致了严重的性能损失让我感到惊讶,因为在我关于JavaScript构造函数/工厂模式主题的上一个问题中,建议使用'new'和普通构造函数.
很可能是我的测试过于简单,或者只是完全错误,或者是最近在chrome的JavaScript引擎或上述所有内容中进行性能优化的结果.无论如何,我真的很想知道为什么我的'优化'导致性能下降 - 而且 - 最重要的是:我的jsperf testrun有没有明显的问题?
构造函数优化的内容之一是共享属性,通常是方法。如果多个对象使用与方法相同的函数,或者共享其他命名属性,则对原型的一次赋值将在从构造函数创建的所有对象之间共享该属性的单个实例,从而减少内存开销,并且不需要重复为创建的每个对象分配每个此类属性,从而减少构造时间开销。
由于您的示例不包含任何此类属性,因此您不会看到此类优势。但是,如果您的生产代码不包含构造对象的共享属性,则很可能没有理由切换到构造函数。
因此,如果您有这样的代码:
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;}
};
};
Run Code Online (Sandbox Code Playgroud)
它可能会比这个运行得更慢:
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;}
Run Code Online (Sandbox Code Playgroud)
如果您创建许多实例,它也会占用更多内存。