【问题标题】:Javascript: Constructor function vs Object Initializer speedJavascript:构造函数与对象初始化器速度
【发布时间】:2014-05-28 06:08:27
【问题描述】:

与等效的对象初始化器相比,构造函数的运行速度有什么不同吗?

例如

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

var object1 = new blueprint(value1,value2);

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

如果有,在优化代码时是否足够相关,或者文件大小是否优先?

【问题讨论】:

  • 你可以在 jsperf.com 测试它
  • @JamesMontagne 我不知道它的存在。谢谢,我必须收藏它以备将来使用。
  • @nnnnnn 是的,我注意到错字并在几分钟前修复了它。
  • 此类问题的答案通常因 JavaScript 实现而异。不同的实现有不同的优化。

标签: javascript performance optimization


【解决方案1】:

如果有,在优化代码时是否足够相关,或者文件大小是否优先?

都没有。

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

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

编写可读、可维护的代码,当一切正确时,检查代码是否慢得令人反感或文件过大并进行优化。

【讨论】:

  • 我一定会记住这一点,马伏里奥。我对此还是很陌生,所以得到这样的建议总是很棒。
【解决方案2】:

在控制台中运行:

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】:

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

附带说明,如果您想创建相似对象的多个实例,请使用构造函数,否则如果只需要单个对象,请使用对象初始化器。

【讨论】:

    【解决方案4】:

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

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2018-08-15
          • 1970-01-01
          • 1970-01-01
          • 2012-03-05
          • 2011-03-10
          • 2021-11-06
          • 1970-01-01
          • 2021-09-10
          • 1970-01-01
          相关资源
          最近更新 更多