Javascript big-O属性访问性能

hug*_*omg 15 javascript

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

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

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

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

最重要的是:

  • 我在哪里可以找到这种渐近的JavaScript性能问题的好参考?

bea*_*mit 7

JavaScript中的每个对象都实现为对象哈希,因此没有功能差异.

例如,看看这个测试:

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

用作职位时,数字会被字符串化.

有关更多信息,请参阅Crockford的有关JavaScript 的网站.特别重要的部分是在"阵列"标题下:

Arrays in JavaScript are also hashtable objects.

性能不是真正的问题,除非你有大量的对象要跟踪(如500,000+),在这种情况下你可能做错了.

你可以做一些优化,但除非你用JavaScript做一些不自然的事情(比如压缩算法......我在JS中使用LZMA实现......糟糕的想法),它们真的没有意义.

注意:

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

  • 阅读链接.数组是哈希表.这意味着它可能是查找的O(logn)(那里有很多优化).我的同事进行了一些测试,发现直到你达到50,000或者其他大的东西之前它并不重要. (3认同)
  • 我知道对象和数组的行为,但我真的想知道大数字会发生什么.你可能不需要去500000 - 如果事情结果是O(N ^ 2),那么只有几千人应该开始担心. (2认同)