Se si esegue il looping di un array, non dovrebbe avere importanza: il ciclo avanzato utilizza comunque gli accessi agli array.
Ad esempio, si consideri questo codice:
public static void main(String[] args)
{
for (String x : args)
{
System.out.println(x);
}
}
Quando decompilato con javap -c Test
otteniamo (per il metodo main
):
public static void main(java.lang.String[]);
Code:
0: aload_0
1: astore_1
2: aload_1
3: arraylength
4: istore_2
5: iconst_0
6: istore_3
7: iload_3
8: iload_2
9: if_icmpge 31
12: aload_1
13: iload_3
14: aaload
15: astore 4
17: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
20: aload 4
22: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
25: iinc 3, 1
28: goto 7
31: return
Ora cambiarlo utilizzare un accesso esplicito array:
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++)
{
System.out.println(args[i]);
}
}
Questo si decompila a:
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iload_1
3: aload_0
4: arraylength
5: if_icmpge 23
8: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
11: aload_0
12: iload_1
13: aaload
14: invokevirtual #3; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: iinc 1, 1
20: goto 2
23: return
C'è un po 'più di codice di configurazione nel ciclo avanzato per, ma fondamentalmente stanno facendo la stessa cosa. Nessun iteratore è coinvolto. Inoltre, mi aspetterei che ricevessero a JITted un codice ancora più simile.
Suggerimento: se davvero pensa che potrebbe fare una differenza significativa (che sarebbe solo mai fare se il corpo del ciclo è assolutamente minuscolo), allora si dovrebbe punto di riferimento con il vostro applicazione reale. Questa è l'unica situazione che conta.
fonte
2009-06-17 11:17:59
Perché non eseguire un punto di riferimento? Molto più accurato di una discussione. – Deestan
È improbabile che notiate la differenza a meno che 'f()' sia estremamente breve. – EJP
Questo è stato [chiesto prima] (http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a-for-loop-and-a-for-each-loop). – RichardOD