【问题标题】:Javascript big-O property access performance [closed]Javascript big-O 属性访问性能
【发布时间】:2011-11-14 12:11:20
【问题描述】:

JavaScript 属性访问的性能特点是什么(在当前实现上)?

  • 假设数组访问是 O(1) 是否安全?
  • 如果我将对象用作哈希表(带有字符串键),我可以安全地假设 O(1) 或 O(log n) 访问时间吗?

  • 是否有任何常见的浏览器或环境比其他浏览器或环境明显快/慢,我应该留意?

  • JavaScript 标准有什么要说的吗?

最重要的是:

  • 我在哪里可以找到有关此类渐近 JavaScript 性能问题的良好参考资料?

【问题讨论】:

标签: javascript


【解决方案1】:

JavaScript 中的每个对象都实现为对象哈希,因此没有功能上的区别。

例如,看看这个测试:

var arr = [];
arr[5] = 5;
arr['5'] = 'not 5';
console.log(arr.length, arr);
// output: 6 [undefined, undefined, undefined, undefined, undefined, "not 5"]

数字在用作位置时被字符串化。

有关 JavaScript 的更多信息,请参阅 Crockford's website。特别重要的部分在“数组”标题下:

Arrays in JavaScript are also hashtable objects.

性能并不是真正的问题,除非您要跟踪大量对象(例如 500,000 多个),在这种情况下您可能做错了什么。

你可以做一些优化,但除非你用 JavaScript 做一些不自然的事情(比如压缩算法......我在 JS 中实现了 LZMA......坏主意),否则它们实际上没有意义。

注意:

如果你有一个备用集(比如你只定义了 10,000 个索引中的 10 个),你可能应该使用一个常规对象。数组会将所有 10,000 个索引初始化为“未定义”,而 Object.keys(obj) 只会报告您设置的 10 个。这是一个实际上有意义的小优化。

【讨论】:

  • 我确实知道对象和数组的行为方式,但我真的很想知道大数字会发生什么。无论如何,你可能不需要去 500000 - 如果结果是 O(N^2),那么几千应该足以开始担心。
  • 阅读链接。数组是哈希表。这意味着查找可能是 O(logn) (那里有很多优化)。我的同事进行了一些测试,发现在你超过 50,000 或其他大点之前它并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 2019-07-21
  • 2011-02-28
  • 1970-01-01
相关资源
最近更新 更多