与等效对象初始值设定项相比,构造函数的运行速度之间是否存在差异?
例如
function blueprint(var1, var2){
this.property1 = var1;
this.property2 = var2;
}
var object1 = new blueprint(value1,value2);
VS
object1 = {property1:value1, property2:value2};
如果存在,在优化代码时是否足以引起关注或文件大小优先?
答案 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引擎,它几乎不重要。