Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:构造函数与对象初始值设定项速度_Javascript_Performance_Optimization - Fatal编程技术网

Javascript:构造函数与对象初始值设定项速度

Javascript:构造函数与对象初始值设定项速度,javascript,performance,optimization,Javascript,Performance,Optimization,与等效的对象初始值设定项相比,构造函数的运行速度有什么不同吗 比如说 function blueprint(var1, var2){ this.property1 = var1; this.property2 = var2; } var object1 = new blueprint(value1,value2); vs 如果有的话,在优化代码时,它是否足够重要,或者文件大小是否会优先考虑呢?我不担心它。构造函数的开销是额外的函数调用和一些额外的属性(如原型)。对于现代的JI

与等效的对象初始值设定项相比,构造函数的运行速度有什么不同吗

比如说

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

var object1 = new blueprint(value1,value2);
vs


如果有的话,在优化代码时,它是否足够重要,或者文件大小是否会优先考虑呢?

我不担心它。构造函数的开销是额外的函数调用和一些额外的属性(如原型)。对于现代的JIT引擎,这应该没什么关系。

我认为对象初始化器将比使用构造函数更快,因为构造函数有一个函数调用,它也必须维护自己的实例

作为旁注,如果要创建类似对象的多个实例,请使用构造函数。如果只需要一个对象,请使用对象初始值设定项。

在控制台中运行:

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);
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);
在控制台中运行:

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);
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);
很明显,哪一个更快。然而,除非你正在经历大量的操作,否则我认为你应该使用更具可读性的东西,不要担心它

如果有的话,在优化代码时,它是否足够重要,或者文件大小是否优先

都不是

像这样的决策对系统性能产生任何(积极)影响是极为罕见的。即使当前的浏览器(或任何您的执行环境)以这样或那样的方式显示出明显的优势,这种差异也不太可能在新版本中持续

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


编写可读的、可维护的代码,当代码完全正确时,检查代码是否在客观上太慢或文件太大,并进行优化。

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

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

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


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

构造函数用于同一“对象”下的多个条目。 对象初始值设定项只能用于有限数量的条目,例如3


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

您可以在jsperf上测试它。com@JamesMontagne我不知道那是真的。谢谢,我必须将其添加到书签中以备将来使用。@nnnnnnnn是的,我注意到了输入错误并在几分钟前修复了它。像这样的问题的答案通常会因JavaScript实现而异。不同的实现有不同的优化。谢谢,Pete。这正是我想要的。如果我用几千行代码编写一个插件的话,最好记住未来。我一定要记住这一点,Malvolio。我还是个新手,所以能得到这样的建议总是很棒的。
 Google Chrome: 2302 milliseconds

Firefox 3.6.17: 2285 milliseconds