¿Se puede evitar que JIT optimice las llamadas a métodos alejados?
Estamos creando una herramienta para el análisis del tiempo de ejecución de casos promedio de los programas de Java Byte Code. Una parte de esto es medir tiempos de ejecución reales. Así que tomaríamos un método arbitrario, proporcionado por el usuario, que puede o no puede tener un resultado y puede tener o no efectos secundarios (los ejemplos incluyen Quicksort, factorial, bucles anidados ficticios, ...) y lo ejecutamos (utilizando la reflexión), midiendo El tiempo transcurrido. (Ya sea que hagamos un punto de referencia adecuado o no, es un punto aparte de esto).
En el código de evaluación comparativa, obviamente no hacemos nada con el resultado (y algunos métodos ni siquiera tienen resultados). Por lo tanto, no se sabe qué puede hacer el JIT y, de hecho, hemos observado que, en ocasiones, parece optimizar todo el método del punto de referencia. Como los métodos de referencia no se utilizan de forma aislada en la realidad, esto hace que la referencia sea inútil.
¿Cómo podemos evitar que JIT haga eso? No queremos desactivarlo por completo, porque la evaluación comparativa lleva años, y queremos comparar los tiempos de ejecución "reales" de todos modos (así que queremos que el JIT esté activodentro el método).
Estoy consciente deesta pregunta pero el escenario dado es demasiado estrecho; no conocemos el tipo de resultado (si lo hay) y, por lo tanto, no podemos utilizar el resultado de alguna manera que el JIT no considere inútil.