【问题标题】:Javascript: Calling Object Properties Multiple TimesJavascript:多次调用对象属性
【发布时间】:2011-10-29 21:53:24
【问题描述】:

我有一个对象:

var object = {
    string1 : 'hello',
    string2 : 'world'
}

如果我想调用objectstring2 属性,那么多次调用它会不会更慢,例如:

...object.string2...
...object.string2...

或者为它创建一个包含参数值的引用会更快:

var string2 = object.string2;
...string2...
...string2...

我认为第二个可能更快的原因,因为我现在认为第一个总是扫描整个对象以获取值。

【问题讨论】:

  • 快了大约 50 纳秒。换个角度来看,这就是光通过 15 米(城市街道的宽度)所需要的时间。换句话说,假设您花了 15 分钟来写这个问题并阅读答案。那时你可以完成 180 亿 个对象引用。真的,真的,你担心错了
  • @Malvolio “多做一些事”...我想尽可能快地编写应用程序。
  • 很公平,但最有限的资源是你自己的时间。如果您有 15 分钟的时间,请花时间进行基准测试。追踪代码中的实际瓶颈并修复它们。 Aquila non captat muscas(老鹰不捕食苍蝇)。

标签: javascript performance oop object reference


【解决方案1】:

你是对的 - 第二个更快,因为 JavaScript 不需要每次都执行 string2 的查找。这种变化更加深刻:

(do stuff with foo.bar.baz.qux)

var property = foo.bar.baz.qux;
(do stuff with property)

在该示例中,必须扫描 foo 中的 bar。然后必须扫描 bar 以查找 baz。等等。

在您的示例中,除非您对 string2 进行大量工作,否则增益将是最小的,但您说它更快是正确的。

【讨论】:

  • 哦,太好了,我沮丧了好几个星期:D 我使用第一个方案,因为它更具可读性并且更容易看到值的来源,但它有点明显它更慢。非常感谢您的回答!
  • 我对这个答案投了反对票,不是因为它是错误的(它没有错),而是因为 OP 的反应,也就是说,“谢谢,我将使用可读性较差的方式因为它为我节省了 0.00000005 秒”。阅读我对这个问题的评论。视角、人物、视角。
  • 同意 - 为了获得任何明显的收益,您需要对很难找到的属性进行大量迭代。即使是很小的优化也很重要(Steve Souders 建议让您的 JS 一次执行最多 50 毫秒),但很可能通过关注更大的瓶颈来获得最大的收益。
【解决方案2】:

在你的情况下,这无关紧要。但是对于具有大原型块的大对象 - 你是对的。 但是您可能会在速度上取胜,但功能上会松散,因为 var a = obj.property 按值应对 - 而不是通过引用,如果 obj.property 将动态更改,则变量 a 将具有 obj.property 的旧值

【讨论】:

  • 你是对的,如果属性会改变,那么我不会得到改变的值。但我真的没有看到可能发生这种情况的现实生活例子。否则,如果我使用速记变量,那么我将使用它,这样变量就会发生变化,如果我在函数中,那么每次调用函数时都会重新生成速记。
  • 很多真实的例子。你有一个对象和一些方法改变他的属性,你有观察者,如果他的至少一个属性发生了变化,它会显示关于对象的新信息。如果您将属性复制到观察者中的变量 - 您将看不到更改并正确显示它。而且'with'运算符非常糟糕,不要'使用它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 2014-07-28
相关资源
最近更新 更多