BMi*_*ner 21 javascript performance key object node.js
这个问题几乎与如何有效地计算JavaScript中对象的键/属性数量相同?.
我想知道一条额外的信息:什么是确定对象中键数量的" 恒定时间 "方式?我主要关心的是在Node.JS中这样做,因为浏览器上的大多数对象都不是太大而不是很受关注.
编辑:
似乎Object.keys(obj).length在谷歌浏览器和Node.JS中以线性时间O(n)返回(即取决于键的数量obj).有更好的O(1)方法吗?
我在Node.JS做了一些测试(源代码如下)
var tests = [10e3, 10e4, 10e5, 10e6]
for(j in tests) {
var obj = {};
for(i = 0; i < tests[j]; i++)
obj[i] = i;
console.time('test' + tests[j]);
Object.keys(obj).length;
console.timeEnd('test' + tests[j]);
}
Run Code Online (Sandbox Code Playgroud)
对于n = 10e3,10e4,10e5,10e6 ...结果是:
test10000: 5ms
test100000: 20ms
test1000000: 371ms
test10000000: 4009ms
Run Code Online (Sandbox Code Playgroud)
经过一些研究,没有办法在常量时间内确定JavaScript对象中的键数,至少在Node ...中还没有确定.Node在内部跟踪这些信息,但它没有公开它,因为在ECMA-262 5th中没有这样做的方法.
值得注意的是,Harmony(ECMA版本6)本身可以支持地图和集合.不确定这些规格会变成什么样.
我被告知我们需要在TC39委员会中提出这个建议.
针对V8的错误报告:http://code.google.com/p/v8/issues/detail? id = 1800