Pregunta

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

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

¿Fue útil?

Solución

Un par de las otras respuestas han sugerido que sólo los métodos finales pueden ser inline - esto no es cierto, como HotSpot es lo suficientemente inteligente como para ser capaz de inline métodos no final, siempre y cuando no se han anulado aún no . Cuando se carga una clase que reemplaza el método, puede deshacer su optimización. lo que, obviamente, el método de promedio final que nunca se requiere ...

Básicamente dejó que la JVM haga su trabajo - es probable que sea mucho mejor en la elaboración de dónde inline de lo que eres

.

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

Otros consejos

A pesar de que el compilador de Java puede hacer en línea (por métodos enlazados en tiempo cortos) en el real procesos en línea se llevará a cabo por el compilador JIT. El JIT (HotSpot) compilador será capaz de, incluso, en línea virtuales métodos. La mejor manera de interactuar con lo que es escribir un código simple y concisa. Lo más probable es el código que utiliza reflexión no permitirá procesos en línea.

Espero que ayude.

'En C ++ que se puede declarar un método "en línea" y el compilador inline que' ... o no. El compilador es libre de hacer la función en línea o no, y realmente no se puede afectar el resultado. Sólo es una sugerencia para el compilador.

En Java no hay tal cosa, el compilador (y más tarde la máquina virtual, mientras que las optimizaciones de rendimiento) pueden decidir 'inline' el método.

Nota que final métodos tienen mayores posibilidades de ser inline (el compilador no puede inline métodos no finales, ya que se pueden sobrescribir en las clases derivadas). Con VM moderna, una optimización similar puede hacerse en tiempo de ejecución. El VM marcará el tipo (por lo que puede realizar comprobaciones de tipo) y tendrá inline el código. Sólo si no pasa la comprobación, se caerá de nuevo en la llamada al método polimórfico sin optimizar originales.

Es más probable que ocurra si Inlining el método en cuestión es:

  • resumen
  • final
  • no depende de cualquiera de los métodos finales largas, no

A medida que estas son las únicas circunstancias en las que la JVM puede estar seguro de los efectos de la llamada.

class A {
    final int foo() { return 3; }
}

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

Inlining el método proporciona los siguientes beneficios en el sitio de llamada:

  • No se llamada al método
  • No envío dinámico
  • Posibilidad de constante veces el valor, por ejemplo. "A.foo () + 2" se convierte en 5 sin código ejecutado en
    tiempo de ejecución.

En el pasado, los programadores suelen insertarse en el final palabra clave exactamente por esta razón . O para facilitar una mejor procesos en línea y aumentar la velocidad de ejecución, que se combinarían muchos métodos más pequeños en uno de los métodos más grande. Pero en muchos aspectos, tales técnicas derrotar a toda la instalación de la modularización y reutilización integrado en el lenguaje de programación.

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

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

Lea este comportamiento para Inlining. http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++ andjava.html

Se dice métodos finales pueden ser inline, pero no siempre.

Sí, si la JVM decide hacerlo, se puede. Formas de influir en la configuración incluyen el método estático o como definitiva.

Por supuesto, lo más importante de todo es que la estructura del método tiene que ser amigable en línea. Breve ayuda, pero lo más importante que hay que utilizar sólo sus variables locales y sus parámetros, no hay campos, y el método de mínimos llamadas a otros métodos en la misma clase.

Sin embargo, usted no debe mirar a hacer este tipo de optimizaciones antes de tiempo, en realidad se podría hacer empeorar las cosas (ya que podría ser un cortocircuito en otras optimizaciones potenciales). La JVM a veces darse cuenta de que un método puede ser inline sin estos consejos.

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

Nota:. Cuadro de desenfoque algoritmo para evaluar el rendimiento de E utiliza

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