martes, 19 de julio de 2011

Optimización del For (for-each)

Hace tiempo que conozco el for-each y nunca me he parado a pensar qué utilidad podría tener ese for teniendo uno que hace lo que quiero y no necesito ni pensar como usarlo.
En las plataformas móviles parece que es aún más útil usar estas estructuras por lo de ahorrar tiempo de proceso y no gastar bateria.

El for-each puede usarse para colecciones que implementan el interfaz Iterable y para Arrays. Con las colecciones, cada elemento implementa en su interfaz las llamadas a hasNext() y next(). Con un ArrayList, un for escrito a mano es cerca de 3 veces más rápido, y para las colecciones el for-each será exáctamente equivalente al uso del for con los ArrayList.
Ejemplos:

static class Foo {
     int mSplat;
}
Foo[] mArray = ...

public void zero() {
     int sum = 0;
     for (int i = 0; i < mArray.length; ++i) {
         sum += mArray[i].mSplat;
     }
}

public void one() {
    int sum = 0;
    Foo[] localArray = mArray;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].mSplat;
    }
}

public void two() {
    int sum = 0;
    for (Foo a : mArray) {
        sum += a.mSplat;
    }
}

  • zero() es la más lenta porque el JIT no puede optimizar el coste de pedir el tamaño del array cada iteración.
  • one() es más rápida. Guarda todo en variables locales, evitando tener que ir a buscarlas fuera del ámbito de la función. Y optimiza la petición del tamaño del Array.
  • two() es la más rápida para dispositivos sin JIT, y distinguiblemente mejor que la one() para los dispositivos con JIT. Usa el for-each introducido en la versión 1.5 del lenguaje de programación Java.


En definitiva que me tendré que acostumbrar a usar for-each por defecto, salvo excepciones que necesite algo especial en iteraciones con ArrayList.



JIT: Compilador al vuelo de la máquina virtual Dalvik (Just In Time compiler).

Texto original y ejemplos via Use Enhanced For Loop Syntax


No hay comentarios:

Publicar un comentario

Related Posts Plugin for WordPress, Blogger...