2008-10-07 25 views
14

Esto es realmente dos preguntas, pero son tan similares, y que sea sencillo, pensé que acababa de rodar juntos:La aceleración de Java

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

  • En segundo lugar: Al escribir un programa desde cero en Java, ¿cuáles son algunas buenas maneras de mejorar considerablemente el rendimiento?

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

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

Respuesta

2

para el perfilado, tratar JAMON para el control del tiempo, y el generador de perfiles de NetBeans para el rendimiento general y monitoreo de memoria.

5

Usando StringBuilder en lugar de grandes conjuntos de concatenación de cadenas da una gran mejora en el rendimiento relativo.

Sin embargo, no puedo evitar decir el rendimiento general de la práctica obtención de beneficios, de perfiles. No sé el perfil de Java de forma directa (solo usé el idioma académicamente), pero el perfil le 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.

+0

En muchos casos, la VM convertirá la concatenación de cadenas en manipulación de StringBuffer. Me sorprendería si hacerlo manualmente aumentara el rendimiento, excepto en los casos más desquiciados. – skaffman

+0

@skaffman, no confunda StringBuilder (no sincronizado) con StringBuffer (sincronizado). – finnw

+0

Desde Java 5, el compilador convierte la concatenación de cadenas en llamadas equivalentes de StringBuilder. Si escribe una clase trivial con concatenación de cadenas, compila y luego abre el archivo .class en un editor de texto, verá las llamadas de reemplazo de StringBuilder. – shadit

2

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

Una cosa buena de la programación orientada a objetos, 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.

19

En primer lugar: la optimización de código, que puede pensar que usted ha hecho los algoritmos adecuados y correcta implementación de 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á usando java 5/6. En ese caso, revisaría la guía de sintonización de java 5 al 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 try/catch puede eliminar. Vea si puede eliminar el lanzamiento innecesario de Excepciones.

Usa cachés donde puedas PERO no más de hacerlo.

Leer eficaz Java, 1º y/o 2º Edición

perfiladores: Consumo YourKit. Es bastante bueno para Java 1.5 y superior. Puedes obtener una licencia personal. Otros perfiladores también son buenos.

Al igual que 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.

+0

try/catch es bastante barato en estos días. No me preocuparía por eso. –

+0

Nota: 'Cachés' no debe incluir grupos de objetos, que no se recomiendan actualmente excepto en el caso de objetos "caros" como grupos de subprocesos o grupos de bases de datos. –

8

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

Perfil y prueba. Nunca optimice su código a menos que esté absolutamente seguro de que lo necesita.

Si se trata de una aplicación GUI, cambie de Swing a AWT o tal vez a la herramienta de Eclipse, se supone que es bastante rápido. Esto es más importante en máquinas virtuales antiguas (he estado trabajando incorporado por un tiempo y estamos en una vm 1.0.x, swing ni siquiera está disponible)

Sé que esto no es específico de Java exactamente, pero no la asignación de objetos - esto incluye la concatenación de cadenas en un bucle (fuera de un bucle que es bastante aceptable esto es lo más grande es probable que pueda hacer

también puede mantenerse alrededor de los objetos en lugar de liberar/reasignación de ellos hay... algunas clases de "referencia" que se pueden usar para retener objetos que no necesita pero que podría reutilizar: el GC no los eliminará a menos que necesite espacio.

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

Es un poco difícil acelerar mucho Java: HotSpot ya hace tanto por usted que cualquier cosa que haga que crea que puede acelerar su código a menudo puede ralentizarla.

+1

La representación en Swing no es tan lenta. La mayoría de las veces es el código comercial el que bloquea el EDT. –

+0

Buen punto, pero en realidad tenía un proyecto incrustado 1.1 (analizador de señal para Agilent) donde la GUI estaba en AWT, la re-codificamos en swing, luego descubrí que el swing era significativamente más lento y lo codificamos nuevamente en AWT. Este es un caso en el que en realidad estábamos dibujando el rastro para el analizador de señal y necesitábamos al menos 20 fps. –

12

Asegúrese de que su nivel de registro de forma accidental no se queden en DEBUG :)

+0

Accidentally. ¡Sí claro! :-) – agnul

+0

Es sorprendente la gran diferencia que esto puede hacer. –

11

"Medida, no adivine."
Aquí hay una buena article sobre el uso de NetBeans Profiler para acelerar la biblioteca de PDF de iText. 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 this whitepaper para obtener información sobre las mejoras de rendimiento en Java 6.

1

He visto que a veces el solo hecho de 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.

+1

Ocurre porque está cerca de agotar el espacio de montón y, por lo tanto, tiene más colecciones de basura para intentar una limpieza. Puede aumentar el espacio de montón como sugirió o encontrar el culpable que está ocupando toda la memoria. –

3

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.

Some comparisons

También, tener cuidado de hacer microbenchmarks para probar el rendimiento, ya que no son significativos debido a la forma más trabajo de máquina virtual. 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 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.

1

Hay una cosa que debe hacer desde el inicio de un proyecto que será de gran ayuda: escriba 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.

1

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.

+0

Todas las JVM desde al menos 1.2 vienen con un generador de perfiles incorporado (-Xrunprof: cpu = samples o similar en la línea de comandos). La parte de visualización puede ser nueva. – StaxMan

0

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).

5

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

No solo necesita ver el tiempo de la CPU, sino también la cantidad de memoria asignada y liberado para un determinado paso. También quiere asegurarse de que no tenga pérdidas de memoria o un gran 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 manera simple de analizar problemas de contienda, consulte mi blog anterior en https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4737

2

También me preguntó esto con respecto a C#, y le 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.

0

Puede parecer irrelevante, pero hay un list of speed tips en el sitio del desarrollador 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.

Cuestiones relacionadas