【发布时间】:2011-12-18 21:13:53
【问题描述】:
这个问题与How to efficiently count the number of keys/properties of an object in JavaScript?几乎相同。
我想知道一条额外的信息:什么是“恒定时间”确定对象中键数量的方法?我最关心的是在 Node.JS 中执行此操作,因为浏览器上的大多数对象都不会太大而不会引起很大的关注。
编辑:
在 Google Chrome 和 Node.JS 中,Object.keys(obj).length 似乎以线性时间 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]);
}
对于 n = 10e3, 10e4, 10e5, 10e6... 结果是:
test10000: 5ms
test100000: 20ms
test1000000: 371ms
test10000000: 4009ms
【问题讨论】:
-
不。我今天感觉很懒惰......:/星期一的情况,我想。
-
我怀疑从调用“Object.keys()”的结果中获取“.length”是常数时间,但我也怀疑调用“Object.keys()”是线性的属性的数量。
-
jsperf.com/object-keys-performance 100 倍于对象中的项目导致它在 Chrome 上的速度是 200 倍。
-
谢谢,@pimvdb——这真是个令人遗憾的消息。 :( Node.JS 中是否有任何常量时间键计数方法?
-
@BMiner 对不起,我的意思是,
Object.keys(o).length是 O(n)。数组上的.length是 O(1)。
标签: javascript performance object node.js key