Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java loop efficiency ("for" vs. "foreach") [duplicate]

(A question for those who know well the JVM compilation and optimization tricks... :-)

Is there any of the "for" and "foreach" patterns clearly superior to the other?

Consider the following two examples:

public void forLoop(String[] text) {     if (text != null)     {         for (int i=0; i<text.length; i++)         {             // Do something with text[i]         }     } }  public void foreachLoop(String[] text) {     if (text != null)     {         for (String s : text)         {             // Do something with s, exactly as with text[i]         }     } } 

Is forLoop faster or slower than foreachLoop?

Assuming that in both cases the text array did not need any do sanity checks, is there a clear winner or still too close to make a call?

EDIT: As noted in some of the answers, the performance should be identical for arrays, whereas the "foreach" pattern could be slightly better for Abstract Data Types like a List. See also this answer which discusses the subject.

like image 446
PNS Avatar asked Feb 10 '12 10:02

PNS


People also ask

Are forEach loops more efficient than for loops?

Deductions. This foreach loop is faster because the local variable that stores the value of the element in the array is faster to access than an element in the array. The forloop is faster than the foreach loop if the array must only be accessed once per iteration.

Is foreach loop faster than for loop Java?

Foreach performance is approximately 6 times slower than FOR / FOREACH performance. The FOR loop without length caching works 3 times slower on lists, comparing to arrays. The FOR loop with length caching works 2 times slower on lists, comparing to arrays.

Is forEach more efficient than for?

forEach is almost the same as for or for..of , only slower. There's not much performance difference between the two loops, and you can use whatever better fit's the algorithm.

Is forEach better than for loop Java?

forEach() can be implemented to be faster than for-each loop, because the iterable knows the best way to iterate its elements, as opposed to the standard iterator way. So the difference is loop internally or loop externally.


1 Answers

From section 14.14.2 of the JLS:

Otherwise, the Expression necessarily has an array type, T[]. Let L1 ... Lm be the (possibly empty) sequence of labels immediately preceding the enhanced for statement. Then the meaning of the enhanced for statement is given by the following basic for statement:

T[] a = Expression; L1: L2: ... Lm: for (int i = 0; i < a.length; i++) {         VariableModifiersopt Type Identifier = a[i];         Statement } 

In other words, I'd expect them to end up being compiled to the same code.

There's definitely a clear winner: the enhanced for loop is more readable. That should be your primary concern - you should only even consider micro-optimizing this sort of thing when you've proved that the most readable form doesn't perform as well as you want.

like image 88
Jon Skeet Avatar answered Sep 20 '22 17:09

Jon Skeet