Javascript:构造函数vs对象初始化器速度

时间:2012-02-07 03:18:41

标签: javascript performance optimization

与等效对象初始值设定项相比,构造函数的运行速度之间是否存在差异?

例如

function blueprint(var1, var2){
    this.property1 = var1;
    this.property2 = var2;
}

var object1 = new blueprint(value1,value2);

VS

object1 = {property1:value1, property2:value2};

如果存在,在优化代码时是否足以引起关注或文件大小优先?

6 个答案:

答案 0 :(得分:7)

  

如果存在,在优化代码时是否足以引起关注或文件大小优先?

都不是。

这样的决定对系统性能有任何(正面)影响是极其罕见的。即使当前浏览器(或任何您的执行环境)以某种方式显示出可观察的优势,这种差异也不太可能在新版本上持续存在。

“优化正确的代码比纠正优化的代码要容易得多。”

编写可读,可维护的代码,当它完全正确时,检查它是否速度慢或文件是否过大并进行优化。

答案 1 :(得分:4)

我认为object intializer比使用构造函数更快,因为构造函数有一个函数调用,它也必须维护自己的实例。

作为旁注,如果要创建多个类似对象的实例,请使用构造函数,如果只需要单个对象,则使用对象初始化器。

答案 2 :(得分:3)

跑进控制台:

function blueprint(var1, var2){
    this.property1 = var1;
    this.property2 = var2;
}

var start = new Date();
var stop;
var object1;
for (var i = 0; i < 1000000; i++) {
    object1 = new blueprint(1,1);
}
stop = new Date();
console.log(stop - start);

结果...

 Google Chrome: 2832 milliseconds

Firefox 3.6.17: 3441 milliseconds

跑进控制台:

var start = new Date();
var stop;
var object1;
for (var i = 0; i < 1000000; i++) {
    object1 = {
        'property1': 1,
        'property2': 1
    };
}
stop = new Date();
console.log(stop - start);

结果...

 Google Chrome: 2302 milliseconds

Firefox 3.6.17: 2285 milliseconds

另一方面,很明显哪一个更快。但是,除非你经历了大量的操作,否则我认为你应该使用更具可读性的东西而不用担心它。

答案 3 :(得分:1)

使用构造函数创建一个只具有value属性的普通对象会适得其反。只需从头开始创建一个简单的对象文字就更快了。如果要从许多不同的地方调用函数,您始终可以定义函数。嘿,你刚刚创建了一个基本的构造函数:lol:

如果您的对象变得不重要,例如包括getter,setter或完整方法,那么构造函数(在共享原型中使用javascript)比从头创建对象快几个数量级。当然,你谈论的是几秒微秒(在典型的桌面上)用于创建具有少量嵌入式javascript的对象与用于调用构造函数的不到一微秒相比,因此在大多数情况下它并不重要。创建仅具有值属性的对象要快一个数量级。

还要记住,构造函数的初始创建是一项昂贵的操作,如果只使用几次,这可能更为重要。在某些情况下,构造函数可以预编译,例如,如果它是在Firefox插件的javascript代码模块中定义的,那么它是双赢的。

还有更多用于创建对象的正式方法,例如Object.create()函数。然而,这使用起来复杂且麻烦,并且在任何当前浏览器中似乎都没有得到很好的优化。在我运行的所有测试中,与其他方法相比,它的速度非常慢,但在需要高级功能并且不会多次调用它时可能会很有用。

答案 4 :(得分:1)

构造函数用于同一&#34;对象&#34;下的多个条目。 对象初始值设定项仅应用于有限数量的条目,例如3.

构造函数对于多个条目更快,而... 对于少数条目,对象初始化器更快,至少在理论上,我没有测试速度,因为我怀疑差异是灾难性的。

答案 5 :(得分:0)

我不担心。构造函数的开销是一个额外的函数调用和一些额外的属性设置(如原型)。使用现代JIT引擎,它几乎不重要。