majidarif majidarif - 13 days ago 7
Javascript Question

for-in vs Object.key forEach without inherited properties

I was looking at a perf benchmark of

Object.keys
+
forEach
vs
for-in
with normal objects.

This benchmark shows that
Object.keys
+
forEach
is 62% slower than the
for-in
approach. But what if you don't want to get the inherited properties?
for-in
includes all non-native inherited objects, so we'll have to use hasOwnProperty to check.

I tried to make another benchmark here doing exactly that. But now the
for-in
approach is 41% slower than
Object.keys
+
forEach
.




update

The above test was done in Chrome. Tested it again but with Safari and I'm getting different results:
Object.keys(..).forEach(..) 34% slower
, odd.


Note: The reason I'm benchmarking is to check how it is with Node.js.


Questions:


  • Are the
    jsperf
    result for Chrome considerable for Node.js?

  • What happened, how come a single conditional made the
    for-in
    approach 41% slower than
    Object.keys
    +
    forEach
    in Chrome?


Answer

node.js uses V8, although I guess it's not the same as the current version in Chrome, but I guess it's a good indicator of node's performances on the subject.

Secondarily, you're using forEach, which is quite handy when developing but adds a callback for every iteration, and that's a (relatively) lenghty task. So, if you're interested in performances, why don't you just use a normal for loop?

for (var i = 0, keys = Object.keys(object); i < keys.length; i++) {
    // ...
}

This yields the best performances you can get, solving your speed problems in Safari too.

In short: it's not the conditional, it's the call to hasOwnProperty that makes a difference. You're doing a function call at every iteration, so that's why for...in becomes slower.