Pregunta

Estoy escribiendo un juego de damas sencillo en Java.Cuando paso el mouse sobre la placa, mi procesador aumenta hasta el 50% (100% en un núcleo).

Me gustaría saber qué parte de mi código (suponiendo que sea mi culpa) se está ejecutando durante esto.

Intenté depurar, pero la depuración paso a paso no funciona muy bien en este caso.

¿Existe alguna herramienta que pueda decirme dónde radica mi problema?Actualmente estoy usando Eclipse.

¿Fue útil?

Solución

Esto se llama "perfilado".Su IDE probablemente venga con uno:ver Perfiladores de código abierto en Java.

Otros consejos

Utilice un perfilador (p. ej. tu kit )

¿Perfiles?No sé qué IDE estás usando, pero Eclipse tiene un perfilador decente y también hay una lista de algunos generadores de perfiles de código abierto en fuente java.

En una palabra, perfiladores le dirá qué parte de su programa se llama y con qué frecuencia.

No perfilo mucho mis programas, por lo que no tengo mucha experiencia, pero he jugado con el IDE de NetBeans Profiler cuando lo estaba probando.(Yo también suelo utilizar Eclipse.También analizaré las funciones de creación de perfiles en Eclipse).

El generador de perfiles de NetBeans le dirá qué subproceso se estuvo ejecutando durante cuánto tiempo y qué métodos se han llamado durante cuánto tiempo, y le proporcionará gráficos de barras para mostrar cuánto tiempo ha tardado cada método.Esto debería darle una pista sobre qué método está causando problemas.Puedes echarle un vistazo a perfilador de Java que proporciona NetBeans IDE, si tiene curiosidad.

La creación de perfiles es una técnica que generalmente se usa para medir qué partes de un programa consumen mucho tiempo de ejecución, lo que a su vez se puede usar para evaluar si realizar optimizaciones sería beneficioso o no para aumentar el rendimiento de un programa.

¡Buena suerte!

1) Es tu culpa :)

2) Si está utilizando eclipse o netbeans, intente utilizar las funciones de creación de perfiles; debería indicarle rápidamente dónde pasa mucho tiempo su código.

3) en su defecto, agregue la salida de la consola donde crea que está el bucle interno; debería poder encontrarlo rápidamente.

Sí, existen tales herramientas:Tienes que perfilar el código.Puedes intentarlo TPTP en eclipse o tal vez intentarlo JProfiler.Eso le permitirá ver cómo se llama y con qué frecuencia.

Utilice un perfilador.Hay muchos.Aquí hay una lista: http://java-source.net/open-source/profilers.Por ejemplo puedes usar JIP, un generador de perfiles codificado en Java.

Trébol le dará un buen informe que muestra el recuento de visitas para cada línea y rama.Por ejemplo, esta línea Fue ejecutado 7 veces.

Hay disponibles complementos para Eclipse, Maven, Ant e IDEA.Es gratis para código abierto, o puedes conseguir un Licencia de evaluación de 30 días..

Si utiliza Sun Java 6, las versiones más recientes de JDK incluyen JVisualVM en el directorio bin.Esta es una herramienta capaz de monitorear y crear perfiles que requerirá muy poco esfuerzo para usar; ni siquiera necesita iniciar su programa con parámetros especiales; JVisualVM simplemente enumera todos los procesos Java actualmente en ejecución y usted elige con cuál desea jugar. .

Esta herramienta le dirá qué métodos utilizan todo el tiempo del procesador.

Hay muchas herramientas más potentes, pero primero prueba con una gratuita.Luego, cuando lea sobre otras funciones disponibles, sabrá cómo podrían ayudarle.

Este es un problema típico de "CPU alta".

Hay dos tipos de problemas de CPU alta

a) ¿Dónde en el hilo se utiliza el 100% de la CPU de un núcleo (este es su escenario)?

b) El uso de CPU es 'anormalmente alto' cuando ejecutamos determinadas acciones.En tales casos, es posible que la CPU no esté al 100%, pero será anormalmente alta.Normalmente, esto sucede cuando tenemos operaciones intensivas de CPU en el código, como análisis XML, serialización, deserialización, etc.

El caso (a) es fácil de analizar.Cuando experimenta 100% de volcados de subprocesos de CPU de 5 a 6 en un intervalo de 30 segundos.Busque un subproceso que esté activo (en estado "ejecutable") y que esté dentro del mismo método (puede inferirlo monitoreando la pila de subprocesos).Lo más probable es que vea una "espera ocupada" (consulte el código a continuación para ver un ejemplo)

while(true){
  if(status) break;
  // Thread.sleep(60000); // such a statement would have avoided busy wait
}

El caso (b) también se puede analizar utilizando volcados de subprocesos tomados en intervalos iguales.Si tiene suerte, podrá encontrar el código del problema. Si no puede identificar el código del problema mediante el volcado de subprocesos.Necesitas recurrir a perfiladores.En mi experiencia, el perfilador YourKit es muy bueno.

Siempre intento primero con los volcados de subprocesos.Los perfiladores serán sólo el último recurso.En el 80% de los casos podremos identificar mediante volcados de subprocesos.

O utilice casos de prueba JUnit y una herramienta de cobertura de código para algunos de sus componentes comunes.Si hay componentes que llaman a otros componentes, rápidamente verás que se ejecutan muchas más veces.

Utilizo Clover con casos de prueba JUnit, pero para código abierto, escuché que EMMA es bastante bueno.

En el código de un solo subproceso, encuentro que agrego algunas declaraciones como esta:System.out.println("A:"+ Sistema.currentTimeMillis());Es más simple y efectivo que usar un perfilador.Pronto podrás delimitar la parte del código que causa el problema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top