我正在寻找Object.keys
+ forEach
vs for-in
普通物体的性能指标.
这个基准表明,Object.keys
+ forEach
是慢62%比for-in
的方法.但是,如果您不想获得继承的属性呢?for-in
包括所有非本地继承对象,因此我们必须使用hasOwnProperty来检查.
我试着在这里做另一个基准测试.但现在这种for-in
方法比+ 慢了41%.Object.keys
forEach
更新
上述测试是在Chrome中完成的.再次测试,但使用Safari,我得到了不同的结果:Object.keys(..).forEach(..) 34% slower
奇怪.
注意:我进行基准测试的原因是检查它与Node.js的关系.
问题:
Chrome的jsperf
结果对Node.js来说是否相当可观?
发生了什么事,怎么来进行的单一条件for-in
的方法要慢41%,比Object.keys
+ forEach
的镀铬?
MaxArt.. 31
node.js使用V8,虽然我猜它与Chrome中的当前版本不一样,但我想这是节点在这个主题上表现的一个很好的指标.
其次,你正在使用forEach
,这在开发时非常方便,但为每次迭代添加了一个回调,这是一个(相对)长度的任务.所以,如果你对表演感兴趣,为什么不用普通的for
循环呢?
for (var i = 0, keys = Object.keys(object); i < keys.length; i++) { // ... }
这样可以获得最佳性能,也可以解决Safari中的速度问题.
简而言之:它不是有条件的,而是对它的呼唤hasOwnProperty
有所作为.你在每次迭代时都在进行函数调用,这就是为什么for...in
变慢.
node.js使用V8,虽然我猜它与Chrome中的当前版本不一样,但我想这是节点在这个主题上表现的一个很好的指标.
其次,你正在使用forEach
,这在开发时非常方便,但为每次迭代添加了一个回调,这是一个(相对)长度的任务.所以,如果你对表演感兴趣,为什么不用普通的for
循环呢?
for (var i = 0, keys = Object.keys(object); i < keys.length; i++) { // ... }
这样可以获得最佳性能,也可以解决Safari中的速度问题.
简而言之:它不是有条件的,而是对它的呼唤hasOwnProperty
有所作为.你在每次迭代时都在进行函数调用,这就是为什么for...in
变慢.
请注意:
var keys = Object.keys(obj), i = keys.length; while(--i) { // }
不会为索引0运行,然后你会错过你的一个属性.
这个像["a","b","c","d"]这样的数组只会运行d,c,b,你会错过"a"'因为索引是0而0是假的.
你需要在检查后减少:
var keys = Object.keys(obj), i = keys.length; while(i--) { // }