Click here to Skip to main content
15,887,135 members
Articles / Programming Languages / JScript .NET
Tip/Trick

Perfomance of for loop

Rate me:
Please Sign up or sign in to vote.
4.85/5 (13 votes)
6 Dec 2012CPOL1 min read 41K   13   20
Lots of for loops are coded wrong causing a potential performance issue.

Introduction

I like looking at the code behind of websites I admire. In doing so I think I've seen one of the most common mistakes when it comes to JavaScript performance. This is not something that would popup quickly because the effect is minimal. But I like coding, so I also like doing right.

Background

The type of loop that I often see coded wrong and which I also used to code wrong in the past is the for loop. And I believe the reason for doing it wrong is, not fully understanding what the syntax does.

This is the example from http://www.w3schools.com/js/js_loop_for.asp:

JavaScript
for (statement 1; statement 2; statement 3)
{
//  the code block to be executed
}

This goes on stating;

Statement 1 is executed before the loop (the code block) starts.

Statement 2 defines the condition for running the loop (the code block).

Statement 3 is executed each time after the loop (the code block) has been executed.

Although this is essentially right, they forget to say that Statement 2 will be executed every time the loop ends a code block.

The wrong example

JavaScript
for(var i=0; i < myarray.length; i++) {
 //do something
}

Why is this wrong?

myarray.length will be executed after every code block. Now if this array is small, the JavaScript engine will answer this question quickly. But what if the condition would be some function that could take a while?

The right example

JavaScript
for(var i=0, j=myarray.length; i < j; i++) {
 //do something
}

Now the length of myarray will only be executed at the start of the loop.

Conclusion

This might seem like a very little win if it comes to performance. But I believe people should always do things right. If myarray.length would be something like calculateSomeVariableLengthByRunningLengthyFunction(), this could end up as a performance penalty.

And even the w3schools tutorial doesn't explain this the right way.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
Netherlands Netherlands
I'm a developer with 22+ years of experience. Starting of on a MVS mainframe, moving to building big multi-tier ERP systems with unix backends, to building web-based BI-Portals. I've seen a lot of different languages, environments and paradigmes.

At this point my main interest is webdevelopment. Mainly javascript/typescript and ASP.NET. But I also like getting my hands dirty on some PHP.

My main focus has been shifting towards full javascript the past years. Almost anything can be accomplished now. From building full offline webapps, to IoT (Tessel), to server (node).

Comments and Discussions

 
GeneralMy vote of 5 Pin
S. M. Ahasan Habib13-Feb-13 19:00
professionalS. M. Ahasan Habib13-Feb-13 19:00 
GeneralMy vote of 5 Pin
Samrat Banerjee9-Dec-12 19:30
Samrat Banerjee9-Dec-12 19:30 
QuestionOnly applies circumstantially... Pin
nich_critic7-Dec-12 7:20
nich_critic7-Dec-12 7:20 
Regarding your example, I'm pretty sure that somearray.length is just a simple variable lookup, so there should be no penalty paid for using it vs the same value, cached.

Your overall point is valid, that if you're calling a method inside a loop that takes a long time to run, and that always returns the same thing, you can get a performance boost by calling the method outside the loop and caching the result. It was also useful to point out that method calls that take a long time to run can hide in statement 2 of the for loop. However your example doesn't help to illustrate this. I can't see any reason to always use the pattern you've suggested. It strikes me as being a little bit too proactive. In practice, I think that people should try to have a better understanding of how long a method takes to run, whether by documentation or testing it.

I think you should replace the example with one that actually has a performance penalty, to demonstrate your point better.
GeneralMy vote of 5 Pin
John Isaiah Carmona6-Dec-12 15:50
John Isaiah Carmona6-Dec-12 15:50 
GeneralMy vote of 5 Pin
Sk. Tajbir6-Dec-12 12:05
Sk. Tajbir6-Dec-12 12:05 
GeneralMy vote of 5 Pin
Hezek1ah8-Nov-12 9:48
Hezek1ah8-Nov-12 9:48 
SuggestionYou should present your workings Pin
John Brett8-Nov-12 0:25
John Brett8-Nov-12 0:25 
GeneralMy vote of 5 Pin
Usm@n7-Nov-12 20:34
Usm@n7-Nov-12 20:34 
GeneralMy vote of 5 Pin
deepuam6-Nov-12 16:53
deepuam6-Nov-12 16:53 
QuestionReverse while is faster in most common situations Pin
nschonni6-Nov-12 13:49
nschonni6-Nov-12 13:49 
AnswerRe: Reverse while is faster in most common situations Pin
Sebastiaan Meijerink6-Nov-12 20:10
professionalSebastiaan Meijerink6-Nov-12 20:10 
GeneralRe: Reverse while is faster in most common situations Pin
nschonni7-Nov-12 5:25
nschonni7-Nov-12 5:25 
GeneralRe: Reverse while is faster in most common situations Pin
Sebastiaan Meijerink7-Nov-12 20:30
professionalSebastiaan Meijerink7-Nov-12 20:30 
GeneralGreat Pin
Ricardo Lynch6-Nov-12 7:04
Ricardo Lynch6-Nov-12 7:04 
QuestionFor loop method not taught Pin
satovey6-Nov-12 5:57
satovey6-Nov-12 5:57 
GeneralRe: For loop method not taught Pin
elijah.manor6-Dec-12 7:56
elijah.manor6-Dec-12 7:56 
GeneralCompiler optimization? Pin
peterboulton6-Nov-12 5:11
professionalpeterboulton6-Nov-12 5:11 
GeneralRe: Compiler optimization? Pin
Sebastiaan Meijerink6-Nov-12 5:49
professionalSebastiaan Meijerink6-Nov-12 5:49 
GeneralRe: Compiler optimization? Pin
peterboulton6-Nov-12 6:35
professionalpeterboulton6-Nov-12 6:35 
GeneralMy vote of 5 Pin
Neeraj_Maurya6-Nov-12 3:10
Neeraj_Maurya6-Nov-12 3:10 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.