ejfrancis
ejfrancis

Reputation: 3035

Javascript For-Loop Condition Caching

I've put together a jsperf test that compares for loops that iterate over an array with caching the array length condition vs not caching. I thought that caching the variable before to avoid recalculating the array length each iteration would be faster, but the jsperf test says otherwise. Can someone explain why this is? I also thought that including the array length variable definition (when cached) within the for loop's initialization would reduce the time since the parse doesn't need to look up the "var" keyword twice, but that also doesn't appear to be the case.

example without caching:

for(var i = 0; i < testArray.length; i++){
   //
}

example with caching

var len = testArray.length;
for(var i = 0; i < len; i++){
  //
}

example with caching variable defined in for loop initialization

for(var i = 0, len=testArray.length; i < len; i++){
   //
}

http://jsperf.com/for-loop-condition-caching

Upvotes: 1

Views: 3085

Answers (2)

Tim Jansen
Tim Jansen

Reputation: 3358

The performance of the scenarios that you posted depends on how smart the JS engine's optimizer is. An engine with a very dump optimizer (or no optimizer at all) will likely be faster when you are using the variable, but you can't even rely on that. After all, length's type is well-known, while a variable can be anything and may require additional checks. Given a perfect optimizer, all three examples should have the same performance. And as your examples are pretty simple, modern engines should reach that point soon.

Upvotes: 1

Benjamin Gruenbaum
Benjamin Gruenbaum

Reputation: 276296

Can someone explain why this is?

This optimization and case is extremely common so modern JavaScript engines will automatically perform this optimization for you.

Some notes:

  • This is not the case when iterating a NodeList (such as the result of querySelectorAll
  • This is an overkill micro optimization for most code paths anyway, usually the body of the loop takes more time than this comparison anyway.

Upvotes: 3

Related Questions