Integración en Java


En C++ puedo declarar un método "inline" y es probable que el compilador lo inline. Por lo que yo entiendo no hay tal palabra clave en Java.

¿La inserción se realiza si la JVM decide hacerlo? ¿Puedo influir en esta decisión de alguna manera?

Author: jonrsharpe, 2009-07-21

8 answers

Un par de las otras respuestas han sugerido que solo los métodos finales se pueden inlinear - esto no es cierto, ya que HotSpot es lo suficientemente inteligente como para poder inlinear métodos no finales siempre y cuando 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 significa que nunca se requiere...

Básicamente deje que la JVM haga su trabajo - es probable que sea mucho mejor en la elaboración de dónde en línea que usted ser.

¿Tienes una situación en la que estás convencido de que la JVM no está haciendo un buen trabajo? Asumiendo que está usando HotSpot, ¿ha intentado usar la versión del servidor en lugar del cliente? Eso puede hacer una enorme diferencia.

 50
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:19:15

Aunque el compilador java puede hacer inline (para métodos cortos de enlace temprano), el real inlining será realizado por el compilador JIT. El compilador JIT (HotSpot) será capaz de,incluso, inline virtual métodos. La mejor manera de interactuar con él es escribir un código simple y conciso. Lo más probable es que el código que utiliza Reflexión no permita la inserción.

Espero que eso ayude.

 6
Author: Shimi Bandiel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:20:59

'En C++ puedo declarar un método "inline" y el compilador lo insertará'... o no. El compilador es libre de hacer la función en línea o no y realmente no puede afectar el resultado. Es solo una pista para el compilador.

En Java no hay tal cosa, el compilador (y más tarde la VM mientras realiza optimizaciones) puede decidir 'inline' el método.

Tenga en cuenta que final métodos tienen mayores posibilidades de ser insertados (el compilador no puede en línea no-final métodos, ya que pueden ser sobrescritos en clases derivadas). Con la máquina virtual 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 comprobación falla, caerá de nuevo en la llamada al método polimórfico original no optimizado.

 5
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:23:01

La inserción es más probable si el método en cuestión es:

  • corto
  • final
  • no depende de ningún método largo y no final

Ya que estas son las únicas circunstancias en las que la JVM puede estar segura de los efectos de la llamada.

 4
Author: PaulJWilliams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:19:57
class A {
    final int foo() { return 3; }
}

Dada esta clase, cualquier llamada a foo() puede ser reemplazada por la constante "3". Cualquier máquina virtual Java1 puede hacer esto, porque la palabra clave final dicta explícitamente que no es posible tener una subclase que anule "int foo()".

La inserción del método proporciona los siguientes beneficios en el sitio de la llamada:

  • No hay llamada al método
  • No hay despacho dinámico
  • Posible doblar constantemente el valor, por ejemplo. "a. foo ()+2" se convierte en 5 sin código ejecutado at
    ejecución.

En el pasado, los programadores a menudo insertaban la palabra clave final exactamente por esta razón. O para facilitar mejor la inserció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 toda la facilidad de modularización y reutilización incorporada en el lenguaje de programación.

JVM moderna, como la máquina virtual Java HotSpot es capaz de alinear la clase sin la final . palabra clave**.

(http://java.sun.com/developer/technicalArticles/Networking/HotSpot/inlining.html)

 2
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:57:11

Lea esto para el comportamiento de inserción. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++andjava.html

Dice que los métodos finales pueden ser Inlineados pero no siempre.

 1
Author: Geek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:16:11

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. Short ayuda, pero lo más importante es que solo necesita usar sus variables locales y sus parámetros, sin campos y llamadas mínimas a otros métodos de la misma clase.

Sin embargo, no debe buscar hacer tales optimizaciones prematuramente, podría en realidad está empeorando las cosas (porque podría estar cortocircuitando otras optimizaciones potenciales). La JVM a veces se dará cuenta de que un método puede ser inlineado sin estas sugerencias.

 1
Author: Yishai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-21 13:19:56

Al comparar una función normal y la función final(que se dice que está en línea por JVM), he visto que no hay mejora de rendimiento entre ellos. Tal vez la sobrecarga de la llamada a la función ya es muy baja.

Nota: Utilicé el algoritmo de desenfoque de caja para evaluar el rendimiento.

 1
Author: Mustafa Kemal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-13 07:26:46