Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

for loop optimization

List<String> flowers = new ArrayList<String>(); 

My for loop currently looks like this...

for (int i = 0; i < flowers.size(); i++) { ... } 

OR should I change this to look like the code given below

int size = flowers.size(); for (int i = 0; i < size; i++) { ... } 

Which is more performant (assuming I have a large array of flowers), I am guessing it should be the latter.

like image 811
Joe Avatar asked May 23 '11 06:05

Joe


People also ask

How does compiler optimize for loop?

Loop invariant computation The variables operation and x are loop invariant, i.e. they don't change the value while the loop is running. A smart compiler can then calculate the value of the expression x*x outside of the loop and reuse it everywhere in the loop. This optimization is called loop invariant code motion.


1 Answers

It is better to use for-each loop [more readable]

for (Flower flower :flowers){     //... } 

I have dumped instructions using javap for the following code:

public void forLoop1() {     List<String> lst = new ArrayList<String>();     for (int i = 0; i < lst.size(); i++) {         System.out.println("hi");     } }  public void forLoop2() {     List<String> lst = new ArrayList<String>();     int size = lst.size();     for (int i = 0; i < size; i++) {         System.out.println("hi");     } } 

public void forLoop1();   Code:    0:   new     #2; //class java/util/ArrayList    3:   dup    4:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V    7:   astore_1    8:   iconst_0    9:   istore_2    10:  iload_2    11:  aload_1    12:  invokeinterface #4,  1; //InterfaceMethod java/util/List.size:()I    17:  if_icmpge       34    20:  getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;    23:  ldc     #6; //String hi    25:  invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/Str ing;)V    28:  iinc    2, 1    31:  goto    10    34:  return  public void forLoop2();   Code:    0:   new     #2; //class java/util/ArrayList    3:   dup    4:   invokespecial   #3; //Method java/util/ArrayList."<init>":()V    7:   astore_1    8:   aload_1    9:   invokeinterface #4,  1; //InterfaceMethod java/util/List.size:()I    14:  istore_2    15:  iconst_0    16:  istore_3    17:  iload_3    18:  iload_2    19:  if_icmpge       36    22:  getstatic       #5; //Field java/lang/System.out:Ljava/io/PrintStream;    25:  ldc     #6; //String hi    27:  invokevirtual   #7; //Method java/io/PrintStream.println:(Ljava/lang/Str ing;)V    30:  iinc    3, 1    33:  goto    17    36:  return 

It doesn't optimize for me.

java version "1.6.0_22" Java(TM) SE Runtime Environment (build 1.6.0_22-b04) Java HotSpot(TM) Client VM (build 17.1-b03, mixed mode, sharing)

So if you need to choose from mentioned two, go for second, but I personally would go for for-each.


for-each Performance

From Item 46 in Effective Java by Joshua Bloch :

The for-each loop, introduced in release 1.5, gets rid of the clutter and the opportunity for error by hiding the iterator or index variable completely. The resulting idiom applies equally to collections and arrays:

// The preferred idiom for iterating over collections and arrays for (Element e : elements) {     doSomething(e); } 

When you see the colon (:), read it as “in.” Thus, the loop above reads as “for each element e in elements.” Note that there is no performance penalty for using the for-each loop, even for arrays. In fact, it may offer a slight performance advantage over an ordinary for loop in some circumstances, as it computes the limit of the array index only once. While you can do this by hand (Item 45), programmers don’t always do so.


See Also

  • Is-there-a-performance-difference-between-a-for-loop-and-a-for-each-loop
like image 133
jmj Avatar answered Oct 01 '22 11:10

jmj