Optimización y Buenas Prácticas en Java
- http://albertoromeu.com/optimizar-codigo-java-android/
- Evitar concatenaciones de Strings, utilizar StringBuffer o StringBuilder para tal caso. La concatenación de Strings produce cada vez un nuevo objeto y por tanto, mayor consumo de memoria y mayor recolección de basura.
- La encriptación y conexiones https tienen peor rendimiento.
- Crear métodos con el menor número de parámetros posible. Esta es de primero de SOLID.
- Si se van a realizar operaciones complejas como, senos, cosenos u otras operaciones complicadas de coma flotante y se sabe de antemano cuál va a ser el resultado, es conveniente pre-calcular estos valores y utilizarlos como constantes.
- Soportar el trabajo off-line siempre que sea posible persistiendo la información en el almacenamiento del dispositivo.
- Sacar fuera de los bucles las constantes y creación de nuevos objetos
- Siempre que vayamos a acceder a la misma posición de un array varias veces, es mejor guardar esa posición en una variable local y así evitar el acceso repetido al índice del array.
- Delegar operaciones demasiado complejas en portales y acceder a los resultados a través de servicios web o conexiones de red.
- Utilizar buffers para leer datos a través de la red y leer los datos en porciones en lugar de byte a byte que es más lento.
- Reutilizar y hacer pool de objetos siempre que sea posible para evitar crear nuevas instancias.
- Liberar recursos tan pronto como sea posible, como conexiones de red, a streams o a ficheros. Normalmente, se suele liberar este tipo de recursos dentro de la cláusula finally para asegurarnos de que los recursos se liberan aún cuando se produzca alguna excepción.
- Referenciar a null instancias de objetos que ya no se van a usar, para que el recolector de basura libere memoria.
- Instanciación perezosa de objetos.
- Los métodos sincronizados son los más lentos, a continuación los métodos de interfaz, los métodos de instancia, los métodos finales y por último los métodos estáticos son los más rápidos. Hay que tener en cuenta esta clasificación para evitar siempre que sea posible la sincronización e interfaces.
- Evitar en cualquier caso sincronización dentro de bucles.
- Usar variables es más eficiente que arrays. Los arrays son más eficientes que Vector o HashTable y en cualquier caso, arrays unidimensionales siempre mejor que bidimensionales. Tener en cuenta también que hay que inicializar la clase Vector y HashTable con un tamaño que se ajuste a nuestras necesidades.
- El acceso a los atributos de una clase es más rápido que encapsular con getter y setter.
- El acceso a variables locales es más rápido que a atributos de la clase. Siempre que sea posible asignar atributos de una clase a una variable local si se va a hacer referencia a ella varias veces dentro de un método o bucle.
- Contar hacia atrás es más rápido en los bucles.
- Usar operadores como x+=1 en vez de x = x+1 ya que generan menos byte code.
- Utilizar desplazamiento de bits en vez de la multiplicación o división si es posible. Por ejemplo, x >> 2 es equivalente a x / 4 y x << 10 es equivalente a x * 1024, 1 << 20 es equivalente a Math.pow(2, 20).
- Cuando sea posible evitar bucles ya que evitaremos toda la sobrecarga de control de flujo en cada iteración. Por ejemplo, si tenemos una operación que se va a realizar 5 veces, en vez de utilizar un bucle podemos realizar las 5 operaciones secuencialmente.
- Normalmente cuesta menos comparar un número a cero, así, siempre que sea posible en un bucle utilizar como guarda una comparación a cero.
- Usar tipos escalares en lugar de objetos Java siempre que sea posible, por ejemplo, int en lugar de Integer.
- Usar excepciones únicamente cuando sea necesario ya que cada excepción lanza un nuevo objeto.
- Sustituir concatenación de Strings por StringBuffer
- Usar “new” sólo cuando sea necesario
- Evitar la creación de objetos temporales innecesarios
- Trazas de depuración
- Inicialización del sistema de trazas
- Evitar el uso de System.out y System.err en código de producción
- Siempre que sea posible, inicializar las colecciones con el tamaño adecuado
- Evitar las llamadas a métodos dentro de las condiciones de bucles
- http://developing.frogtek.org/2010/09/10/10-mandamientos-java/
- Si tenemos un método estático , no debería poder acceder a variables que no están pensadas para llamarse de forma estática
- Si tenemos una variable estática, no deberíamos poder escribirla desde un método perteneciente a un objeto instanciado
- No dejar vacíos if-else / switch
- No repetir contenido en if-else / switch
- Verificar que todos los métodos privados son invocados en algún momento
- No usar nombres cortos para variables, a excepción de las variables de iteración
- Verificar la visibilidad de las variables
- Documentar (javadoc)
- Evitar duplicidad de literales
- https://www.securecoding.cert.org/confluence/display/java/ERR04-J.+Do+not+complete+abruptly+from+a+finally+block
No hay comentarios:
Publicar un comentario