Debe evitar todas las optimizaciones si la única creencia de que el código que está optimizando será lento. El único código que debe optimizar es cuando sabe que es lento (preferiblemente a través de un generador de perfiles).
Si se escribe clara y fácil de entender el código entonces las probabilidades son que va a ser lo suficientemente rápido, y si no lo es entonces cuando se va a acelerarlo Debería ser más fácil de hacer.
Dicho esto, debe aplicar el sentido común (!). ¿Debería leer un archivo una y otra vez o debería almacenar en caché los resultados? Probablemente almacenar en caché los resultados. Entonces, desde el punto de vista de la arquitectura de alto nivel, debería pensar en la optimización.
La parte "mal" de optimización es el "pecados" que se cometen en nombre de hacer algo más rápido - esos pecados generalmente resultan en el código que es muy difícil de entender. No estoy 100% seguro de que este sea uno de ellos ..pero mira this question here, esto puede o no ser un ejemplo de optimización (podría ser la forma en que la persona pensó hacerlo), pero hay formas más obvias de resolver el problema que las elegidas.
Otra cosa que puede hacer, lo cual hice recientemente, es cuando está escribiendo el código y necesita decidir cómo hacer algo. Escríbalo en ambos sentidos y ejecútelo a través de un generador de perfiles. A continuación, elija la forma más clara de codificarlo a menos que haya una gran diferencia en velocidad/memoria (dependiendo de lo que busque). De esta forma, no está adivinando qué es "mejor" y puede documentar por qué lo hizo de esa manera para que alguien no lo cambie más adelante.
El caso que estaba haciendo era usar archivos mapeados en memoria -vs-stream I/O ... el archivo mapeado en memoria era significativamente más rápido que en el otro sentido, así que no estaba preocupado si el código era más difícil de seguir (no lo fue) porque la aceleración fue significativa.
Otro caso que tuve fue la decisión de "internar" String en Java o no. Hacerlo debería ahorrar espacio, pero a un costo de tiempo. En mi caso, el ahorro de espacio no fue enorme, y el tiempo fue doble, así que no hice el internado. Documentarlo le permite a otra persona saber que no se moleste en internarlo (o si quieren ver si una versión más nueva de Java lo hace más rápido, entonces pueden intentarlo).
Wiki de la comunidad? –
En su ejemplo, tener el bucle invariante dentro del bucle es una práctica de programación deficiente, y debe estar bien documentado por qué está dentro del bucle para los pocos casos de excepción en que podría ser necesario. – Elie