Si está ejecutando un bucle en una matriz, no debería importar: de todos modos, el bucle forzado mejorado usa acceso a la matriz.
Por ejemplo, considere este código:
public static void main(String[] args)
{
for (String x : args)
{
System.out.println(x);
}
}
Cuando descompilada con javap -c Test
obtenemos (para el método 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
Ahora cambiarlo a utilizar un explícita de acceso a conjunto:
public static void main(String[] args)
{
for (int i = 0; i < args.length; i++)
{
System.out.println(args[i]);
}
}
Esto se descompila 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
Hay un poco más de código de configuración en el bucle forzado mejorado, pero básicamente están haciendo lo mismo. No hay iteradores involucrados. Además, esperaría que se JITted a un código aún más similar.
Sugerencia: si realmente piensa que podría hacer una diferencia significativa (que solo alguna vez hacer si el cuerpo del bucle es absolutamente minúsculo), entonces debe compararlo con su aplicación real. Esa es la única situación que importa.
Por qué no corren un punto de referencia? Mucho más preciso que una discusión. – Deestan
Es poco probable que note la diferencia a menos que 'f()' sea extremadamente corto. – EJP
Esto ha sido [preguntado antes] (http://stackoverflow.com/questions/256859/is-there-a-performance-difference-between-a-for-loop-and-a-for-each-loop). – RichardOD