2011-10-22 17 views
5

Tengo una aplicación Java, que no es lo suficientemente rápida como esperaba. He realizado muchas búsquedas sobre cómo mejorarlo, pero no con suerte.¿Cómo saber cuánto tiempo cuesta el código "sincronizado" en Java?

Ahora estoy revisando el código y encontré que hay muchas palabras clave synchronized en el código. Estoy pensando si se tomaron demasiado tiempo en esperar los bloqueos.

¿Hay alguna herramienta para verificar cuánto tiempo cuestan? Por lo tanto, puedo encontrar una mejor solución si cuestan demasiado tiempo.

+2

Si la 'sincronización' se realiza en bloques más grandes de lo necesario, pueden reducir el rendimiento debido a una espera innecesaria. – Cratylus

+1

¿Has probado alguna herramienta de creación de perfiles? – xappymah

Respuesta

4

Iba a sugerir la función Thread Monitor de jvisualvm y, mientras buscaba una captura de pantalla, se topó con esta entrada de blog: Detecting Thread Contentions. Es mucho mejor que solo una captura de pantalla :).

Pero aquí está de todos modos: thread contention in jvisualvm (Crédito de la imagen: entrada en el blog antes mencionado)

1

Un buen generador de perfiles será capaz de identificar los métodos que están causando lentitud, puede no estar relacionado con la sincronización en absoluto. También observar el estado de los hilos en Profiler puede revelar si hay demasiada espera debido a la sincronización. En cualquier caso, a menos que la palabra clave sincronizada se use sin ninguna razón, puede ser contraproducente eliminarla en aras del rendimiento.

+0

Si no se necesita 'sunchronization', se perderá el rendimiento. Si se necesita' sincronización 'i) se debe hacer con los niveles adecuados de granularidad ii) si se elimina, no será contraproducente, será un desastre – Cratylus

+0

user384706 Estoy de acuerdo. OP necesita entender por qué el código está sincronizado solo entonces se puede tomar el remedio adecuado. –

1

El costo de la sincronización es generalmente pequeña. El problema suele ser lo que haces en los bloques de sincronización. Asegúrese de no hacer ningún IO (socket o red) e, idealmente, ninguna llamada al sistema y el tiempo de bloqueo será inferior a microsegundo para tareas simples.

Cuestiones relacionadas