martes, 4 de julio de 2017

Optimización y Buenas Prácticas en Java

  • http://albertoromeu.com/optimizar-codigo-java-android/




  1. 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.
  2. La encriptación y conexiones https tienen peor rendimiento.
  3. Crear métodos con el menor número de parámetros posible. Esta es de primero de SOLID.
  4. 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.
  5. Soportar el trabajo off-line siempre que sea posible persistiendo la información en el almacenamiento del dispositivo.
  6. Sacar fuera de los bucles las constantes y creación de nuevos objetos
  7. 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.
  8. Delegar operaciones demasiado complejas en portales y acceder a los resultados a través de servicios web o conexiones de red.
  9. 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.
  10. Reutilizar y hacer pool de objetos siempre que sea posible para evitar crear nuevas instancias.
  11. 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.
  12. Referenciar a null instancias de objetos que ya no se van a usar, para que el recolector de basura libere memoria.
  13. Instanciación perezosa de objetos.
  14. 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.
  15. Evitar en cualquier caso sincronización dentro de bucles.
  16. 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.
  17. El acceso a los atributos de una clase es más rápido que encapsular con getter y setter.
  18. 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.
  19. Contar hacia atrás es más rápido en los bucles.
  20. Usar operadores como x+=1 en vez de x = x+1 ya que generan menos byte code.
  21. 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).
  22. 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.
  23. 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.
  24. Usar tipos escalares en lugar de objetos Java siempre que sea posible, por ejemplo, int en lugar de Integer.
  25. Usar excepciones únicamente cuando sea necesario ya que cada excepción lanza un nuevo objeto.

  • ???

  1. Sustituir concatenación de Strings por StringBuffer
  2. Usar “new” sólo cuando sea necesario
  3. Evitar la creación de objetos temporales innecesarios
  4. Trazas de depuración
  5. Inicialización del sistema de trazas
  6. Evitar el uso de System.out y System.err en código de producción
  7. Siempre que sea posible, inicializar las colecciones con el tamaño adecuado
  8. Evitar las llamadas a métodos dentro de las condiciones de bucles

  • http://developing.frogtek.org/2010/09/10/10-mandamientos-java/

  1. 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
  2. Si tenemos una variable estática, no deberíamos poder escribirla desde un método perteneciente a un objeto instanciado
  3. No dejar vacíos if-else / switch
  4. No repetir contenido en if-else / switch
  5. Verificar que todos los métodos privados son invocados en algún momento
  6. No usar nombres cortos para variables, a excepción de las variables de iteración
  7. Verificar la visibilidad de las variables
  8. Documentar (javadoc)
  9. Evitar duplicidad de literales

  • https://www.securecoding.cert.org/confluence/display/java/ERR04-J.+Do+not+complete+abruptly+from+a+finally+block

  1. xxx
  2. xxx