He estado usando Yourkit 8.0 para perfilar una aplicación matemáticamente intensiva que se ejecuta bajo Mac OS X (10.5.7, Apple JDK 1.6.0_06-b06-57), y he notado algunas extrañas comportamiento en los resultados de perfiles de CPU.Perfilado de métodos nativos en Java - resultados extraños
Por ejemplo, hice una ejecución de generación de perfiles utilizando muestreo, que informó que el 40% del tiempo de ejecución de 10 minutos de la aplicación se gastó en el método StrictMath.atan. Encontré esto desconcertante, pero lo tomé por su palabra y pasé un poco de tiempo reemplazando atan con un ajuste polinomial extremadamente simple.
Cuando volví a ejecutar la aplicación, me tomó casi exactamente el mismo tiempo que antes (10 minutos), pero mi reemplazo atan no apareció en ninguna parte en los resultados del perfilado. En cambio, los porcentajes de tiempo de ejecución de los otros puntos de acceso principales simplemente aumentaron para compensarlo.
Para resumir:
resultados con StrictMath.atan (método nativo)
tiempo de ejecución total: 10 minutos
Método 1: 20%
Método 2: 20%
Método 3: 20%
StrictMath.atan: 40%
RESULTADOS CON simplificada de Java, pura atan
tiempo de ejecución total: 10 minu tes
Método 1: 33%
Método 2: 33%
Método 3: 33%
(Métodos 1,2,3 no realizan ninguna llamada atan)
Cualquier idea de lo que es con este comportamiento? Obtuve los mismos resultados usando el JProfiler de EJ-Technologies. Parece que la API de creación de perfiles JDK informa resultados inexactos para los métodos nativos, al menos en OS X.
No me sorprendería si 'atan' fuera intrínseco: en lugar de llamar a un método, el código de máquina equivalente se inyecta en línea. –
He experimentado esto también con varios métodos en StrictMath en Mac OS X 10.7 (y versiones anteriores también). –
Entonces, ¿hay alguna solución a este problema? – ziggystar