tuning java optimization performance

tuning - Acelerando Java



java performance tuning (15)

En realidad, se trata de dos preguntas, pero son muy similares, y para hacerlo simple, pensé que simplemente las juntaría:

  • En primer lugar : dado un proyecto Java establecido, ¿cuáles son algunas formas decentes para acelerarlo más allá de la simple optimización en código?

  • En segundo lugar : cuando se escribe un programa desde cero en Java, ¿cuáles son algunas buenas formas de mejorar el rendimiento?

Por favor, manténgase alejado de las técnicas de optimización generales a menos que sean específicas de Java .

Pregunté esto sobre Python y Perl antes. Para Java me pregunto qué buenos consejos / trucos hay para mejorar el rendimiento y si hay perfiladores Java especialmente buenos.


"Mide, no adivines".
Aquí hay un buen artículo sobre el uso del NetBeans Profiler para acelerar la biblioteca iText PDF. He usado NetBeans Profiler y he descubierto que es muy fácil y útil para rastrear algunos problemas de rendimiento que tenía.

Para una aplicación anterior, simplemente pasar a Java 6 podría ser un aumento de rendimiento. Consulte este documento técnico para obtener información sobre las mejoras de rendimiento en Java 6.


Al igual que para cualquier idioma, use algoritmos y estructuras de datos apropiados.

Una cosa buena de OOP es que es posible que pueda cambiar las implementaciones de un objeto sin cambiar la interfaz. Eso le permite comenzar a codificar con implementaciones ingenuas y reemplazarlas si es necesario.


Aquí hay un documento (más antiguo) de Peter Sestoft que vale la pena leer: Performance in java . Algunos de los consejos probablemente ya no sean ciertos, ya que Java mejoró mucho con las versiones posteriores en optimizaciones. Pero todavía hay un buen conjunto de gemas para utilizar y probar cuando el generador de perfiles ha encontrado algo que no puede hacer de otra manera (es decir, cambiar algorítmicamente).


Asegúrate de que tus niveles de registro no se dejen accidentalmente en DEPURACIÓN :)


El uso de StringBuilder en lugar de grandes conjuntos de concatenación de cadenas brinda un gran aumento relativo del rendimiento.

Sin embargo, no puedo evitar decir que el rendimiento de la práctica general es beneficioso, perfil. No conozco el perfil de Java de forma directa (solo usé el idioma académicamente), pero la creación de perfiles lo ayuda a identificar secciones problemáticas de su código, y es mucho más fácil corregir secciones específicas ya que tiene algo que buscar.


En primer lugar: mediante la optimización del código, supongo que ha hecho los algoritmos correctos y la correcta implementación de los algoritmos. En ese caso, usaría el generador de perfiles y vería con qué frecuencia su recolector de basura (GC) está recogiendo basura y cuánto tiempo utiliza para hacerlo. Luego empiezas a trabajar en las opciones de GC, pero ten cuidado de que puedas tener problemas si no sabes lo que estás haciendo.
Supongo que estás usando Java 5/6. En ese caso, revisaría la guía de ajuste de java 5 en http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html . También hay un boletín muy bueno sobre el rendimiento de Java llamado http://www.javaperformancetuning.com/ al que puede suscribirse.

Aparte de eso, mira cuántos bloques de try / catch puedes eliminar. Vea si puede eliminar lanzamientos innecesarios de Excepciones.

Usa Cachés donde puedas PERO no lo hagas en exceso.

Lea Effective Java, 1st and 2nd Edition

Perfiladores: uso tu kit. Es bastante bueno para Java 1.5 y superior. Puedes obtener una licencia personal. Otros perfiladores también son buenos.

Al igual que usted tiene pruebas de unidad e integración, NO hace daño tener algunas pruebas de rendimiento que ejecuta como parte de sus compilaciones de INTEGRACIÓN CONTINUA (CI). De esta forma sabrá cuándo retrocedió, especialmente si está utilizando un buen servidor de compilación CI.


Hay una cosa que debes hacer desde el inicio de un proyecto que será de gran ayuda: escribir un código legible.

No intente escribir métodos largos para evitar llamadas a métodos. Los compiladores se alinearán si es necesario, pero pueden producir código pobre para métodos largos. Si el código es difícil de leer, a menudo los problemas de rendimiento serán causados ​​por hacer algo mental que no se puede ver por el desorden.


Java 1.6_07 + viene con su propio generador de perfiles. Se llama Java VisualVM. Simplemente escriba jvisualvm en el símbolo del sistema si tiene su% JAVA_HOME% / bin en su RUTA.


No optimices a ciegas. Utilice Yourkit o cualquier otro buen perfilador para averiguar los "puntos de acceso" en su aplicación.

No solo debe echar un vistazo al tiempo de CPU, sino también a la cantidad de memoria asignada y liberada para determinado paso. También debe asegurarse de no tener pérdidas de memoria o un alto consumo de memoria. La mejor herramienta para analizar el consumo de memoria que conozco es el Eclipse Memory Analyzer ( http://www.eclipse.org/mat ).

Otras dimensiones son problemas de IO y contención de hilos. Para una forma sencilla de analizar los problemas de contención, consulte mi antiguo blog en https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4737


Para crear perfiles, pruebe JAMON para la supervisión del tiempo y NetBeans Profiler para el rendimiento general y la supervisión de la memoria.


Puede parecer irrelevante, pero hay una lista de consejos de velocidad en el sitio para desarrolladores de Android. Se está ejecutando en un teléfono en bytecode dalvik no estándar, pero muchos de los consejos allí enumerados son universalmente aplicables a Java en general.


Se puede obtener otra ganancia de rendimiento potencial al cambiar a una VM más rápida. No todos son iguales, y algunos son más adecuados para diferentes tipos de aplicaciones. También pueden tener tipos específicos de personalizaciones que admiten, así como las estándar.

Algunas comparaciones

Además, tenga cuidado de hacer microbenchmarks para probar el rendimiento, ya que no son significativos debido al funcionamiento de la mayoría de las VM. Por lo tanto, algunas pruebas de rendimiento muy simples pueden comportarse de manera diferente debido a razones que no son obvias.

Simplemente ejecutar una prueba y luego cambiar un pequeño fragmento de código o una opción de VM y ejecutarlo de nuevo, puede producir resultados diferentes, pero no tiene nada que ver con los cambios que ha realizado.


También preguntaste esto con respecto a C #, y yo daría la misma respuesta, y que es un error comenzar siendo un idioma específico. Una vez que haya exprimido cada ciclo que puede obtener utilizando técnicas y enfoques generales, las cosas específicas del idioma pueden marcar la diferencia.


Use la última máquina virtual: cada vez son mejores.

Perfil y prueba. Nunca optimices tu código a menos que estés absolutamente seguro de que lo necesitas.

Si se trata de una aplicación de interfaz gráfica de usuario, cambiar de Swing a AWT o tal vez kit de herramientas de Eclipse, se supone que es bastante rápido. Esto es más importante en máquinas virtuales antiguas (he estado trabajando integrado por un tiempo y estamos en realidad en una vm 1.0.x, swing ni siquiera está disponible)

Sé que esto no es específico de Java exactamente, pero no asigna objetos, esto incluye la concatenación de cadenas en un bucle (fuera de un bucle es bastante aceptable. Esto es lo más grande que probablemente puedas hacer).

También puede mantener objetos en lugar de liberarlos / reasignarlos. Hay algunas clases de "referencia" que se pueden usar para retener objetos que no necesita, pero que podría querer reutilizar: el GC no los eliminará a menos que necesite el espacio.

Asigne más espacio si es necesario con el argumento -MX.

Es un poco difícil acelerar mucho Java: HotSpot ya hace tanto por ti que cualquier cosa que hagas que creas que puede acelerar tu código a menudo puede ralentizarla.


He visto que a veces solo darle a la JVM más memoria de almacenamiento ayudará a una aplicación lenta. Esto se controla con las opciones de JVM -xmx y -xms al inicio.