Grow your CSS skills. Land your dream job.

Last updated on:

Loop Through Array Without Wasteful Lookups

Find the length of the array before using it in the for function, so it doesn't need to count the length of the array each iteration (assuming the length won't be changing mid-loop).

var arLen=myArray.length;

for ( var i=0, len=arLen; i<len; i++ ){
  // do something with myArray[i]
}

Comments

  1. Alex
    Permalink to comment#

    While you are correct that it speeds things up, it’s not because the alternative has to count the length each time. With a language like java where the length/size/count method on the array object is in fact a method (that presumably does some calculation to figure out the size) then it is better to cache the size in the way you described.

    The reason that it is slightly faster this way, is because the browser does have to dereference the array object each time it gets its length, not recalculate the length.

    Also if you want to make another very slight improvement here you can do:

    for (var i = 0, len=myArray.length; i < len; ++i) {
    // loop-the-loop
    }

    where the key here is the ++i instead of i++.

    • LuK
      Permalink to comment#

      Why is this faster?

    • Permalink to comment#

      The post-increment operator (i++) first returns the current value of i and then increments it by one. The pre-increment operator (++i) first increments the value and then returns the value.

      As you can see, the compiler needs to hold the previous state of i as return value for i++ whereas for ++i it returns the incremented state. The difference is really minuscule though but hey, we just saved an otherwise wasted lookup. ;-)

  2. Permalink to comment#

    Another tiny trick that may help speed things up is to count down to zero if possible, as it is quicker to do a compare to zero, than to do a ‘less than’ (which is fundamentally a subtraction followed by a comparison with zero.

  3. One more thing I would like to suggest is that why have you used another variable len to store the value of the length of the array:

    len=arLen

    why not just:

    var arLen=myArray.length;

    for ( var i=0; i<arLen; i++ ){
    // do something with myArray[i]
    }

    Very interesting points for a simple loop structure :) Really very conceptual.. Love the comments!

  4. Chris
    Permalink to comment#

    Why not ditch both variables and simplify the test condition even further?

    instead of:

    len=arLen

    or:

    var arLen=myArray.length;

    how about this:

    var i = myArray.length;
    while (i–) {
    // do something with myArray[i]
    };

  5. Konstantin
    Permalink to comment#

    this is benchmark for this topic http://jsperf.com/for-loop-research

  6. Smogha
    Permalink to comment#

    I think we can further optimize it. As per my understanding arLen should be iLen. arLen refer as if this is a variable of array type but this is an integer variable. We always follow best variable naming conventions concerning future code maintenance.

Leave a Comment

Posting Code

Markdown is supported in the comment area, so you can write inline code in backticks like `this` or multiline blocks of code in in triple backtick fences like ```this```. You don't need to escape code in backticks, Markdown does that for you.

Sadly, it's kind of broken. WordPress only accepts a subset of HTML in comments, which makes sense, because certainly some HTML can't be allowed, like <script> tags. But this stripping happens before the comment is processed by Markdown (via Jetpack). It seems to me that would be reversed, because after Markdown processes code in backticks, it's escaped, thus safe. If you think you can fix this issue, get in touch!

If you need to make sure the code (typically HTML) you post absolutely posts correctly, escape it and put it within <pre><code> tags.

Current ye@r *

*May or may not contain any actual "CSS" or "Tricks".