Inlinear en Java
jvm inlining (8)
En C ++ puedo declarar un método "en línea" y es probable que el compilador lo alinee. Por lo que yo entiendo, no hay tal palabra clave en Java.
¿La alineación se hace si la JVM decide hacerlo? ¿Puedo influir en esta decisión de alguna manera?
Al comparar una función normal y una función final (que se dice que está en línea por JVM), he visto que no hay una mejora en el rendimiento entre ellos. Tal vez la sobrecarga de la función ya es muy baja.
Nota: utilicé el algoritmo de desenfoque de cajas para evaluar el rendimiento.
Algunas de las otras respuestas han sugerido que solo se pueden incluir los métodos finales; esto no es cierto, ya que HotSpot es lo suficientemente inteligente como para poder incorporar métodos no finales siempre que no se hayan anulado todavía . Cuando se carga una clase que anula el método, puede deshacer su optimización. Obviamente, hacer que el método final signifique que nunca se requiere ...
Básicamente deje que la JVM haga su trabajo; es probable que sea mucho mejor para averiguar dónde en línea que usted.
¿Tiene una situación en la que está convencido de que la JVM no está haciendo un buen trabajo? Suponiendo que está utilizando HotSpot, ¿ha intentado utilizar la versión del servidor en lugar del cliente? Eso puede hacer una gran diferencia.
Aunque el compilador de java puede hacerlo en línea (para los métodos cortos de enlace temprano), la compilación real será realizada por el compilador JIT. El compilador JIT (HotSpot) podrá, incluso, utilizar métodos virtuales en línea. La mejor forma de interactuar con él es escribir un código simple y conciso. Lo más probable es que el código que usa Reflection no permita la alineación.
Espero que ayude.
La inclusión es más probable que ocurra si el método en cuestión es:
- corto
- final
- no depende de ningún método largo, no final
Como estas son las únicas circunstancias en las que JVM puede estar seguro de los efectos de la llamada.
Lea esto para conocer el comportamiento de Inline. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++andjava.html
Dice que los métodos finales pueden ser Inlined pero no siempre.
Sí, si la JVM decide hacerlo, puede hacerlo. Las formas de influir incluyen establecer el método como estático o como final.
Por supuesto, lo más importante es que la estructura del método debe ser amigable en línea. Ayuda breve, pero lo más importante es que solo necesita usar sus variables locales y sus parámetros, sin campos y llamadas a métodos mínimos a otros métodos en la misma clase.
Sin embargo, no debe considerar hacer tales optimizaciones prematuramente, en realidad podría empeorar las cosas (porque podría estar cortocircuitando otras optimizaciones potenciales). La JVM a veces se dará cuenta de que se puede insertar un método sin estas sugerencias.
"En C ++ puedo declarar un método" en línea "y el compilador lo insertará '' ... o no. El compilador es libre de hacer la función en línea o no y realmente no se puede afectar el resultado. Es solo una pista para el compilador.
En Java no existe tal cosa, el compilador (y más adelante la VM al realizar optimizaciones) puede decidir "alinear" el método.
Tenga en cuenta que los métodos finales tienen mayores posibilidades de estar en línea (el compilador no puede alinear métodos no finales, ya que pueden sobrescribirse en clases derivadas). Con la VM moderna, se puede realizar una optimización similar en tiempo de ejecución. La máquina virtual marcará el tipo (para que pueda realizar comprobaciones de tipo) e insertará el código. Solo si la verificación falla, volverá a caer en la llamada al método polimórfico no optimizado original.
class A {
final int foo() { return 3; }
}
Dada esta clase, cualquier llamada a foo () puede reemplazarse con la constante "3". Cualquier máquina virtual Java1 puede hacer esto, porque la palabra clave final explícitamente dicta que no es posible tener una subclase que anule "int foo ()".
Alinear el método proporciona los siguientes beneficios en el sitio de llamadas:
- Sin método de llamada
- Sin envío dinámico
- Posible doblar constantemente el valor, ej. "a.foo () + 2" se convierte en 5 sin código ejecutado en
tiempo de ejecución
En el pasado, los programadores a menudo insertaban la palabra clave final exactamente por esta razón . O para facilitar mejor la creación y aumentar la velocidad de ejecución, combinarían muchos métodos más pequeños en un método más grande. Pero en muchos sentidos, tales técnicas derrotan a toda la instalación de modularización y reutilización integrada en el lenguaje de programación.
Modern JVM, al igual que Java HotSpot VM, es capaz de alinear la clase sin la final . palabra clave**.
( http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html )