salto linea java c++ inlining

java - linea - jlabel multiline netbeans



¿Qué es en línea? (10)

Al ejecutar una determinada pieza de código, cada vez que llama a una función estándar, el tiempo de ejecución es ligeramente superior al volcado del código contenido en esa función. Volcar cada vez que todo el código contenido en una función es impensable en el otro extremo porque, obviamente, conduce a todo un lío de duplicación de código.

Inlining resuelve el problema de rendimiento y mantenibilidad permitiéndole declarar la función como inline (al menos en C ++), de modo que cuando llame a esa función, en lugar de hacer que su aplicación salte durante el tiempo de ejecución, el código de la función inline se inyecte al compilar cada vez que se llama a esa función dada.

La desventaja de esto es que, si en línea grandes funciones a las que llama muchas veces, el tamaño de su programa puede aumentar significativamente (las mejores prácticas sugieren hacerlo solo en funciones pequeñas).

Me refiero a esta discusión . Nunca he escrito ningún código en C o en C ++. No tengo ningún fondo CS. Sin embargo, he estado trabajando como desarrollador de Java durante 5 años y ahora he decidido aprender más sobre CS y ponerme al día.


Básicamente, en C / C ++, el compilador puede incorporar funciones en línea, lo que significa que, en lugar de hacer una llamada a la función para realizar esa operación, el código se agregará al bloque de la función de llamada, por lo que será como si nunca hubiera sido una operación separada. Llamada de función.

Esto se explicará con más detalle: http://www.codersource.net/cpp_tutorial_inline_functions.html


Como desarrollador de Java, generalmente no tiene que preocuparse por la incorporación de métodos. El compilador Just-in-time de Java puede y lo hará automáticamente en la mayoría de los lugares donde tenga sentido.

Los IDE como eclipse pueden tener una función que le permite incluir métodos en línea en el nivel del código fuente; nunca haga esto por desempeño, solo para facilitar la lectura del código (por ejemplo, cuando se da cuenta de que el método solo llama a otro método sin agregar nada útil por sí mismo).


Como ya se mencionó en otras respuestas, la inclusión tiene un costo. Por lo general, esto se considera pequeño, sin embargo, al medirlo en realidad puede sorprenderse y aprender que podría ser mayor que lo que gana (de modo que lo que otros dicen es cierto: no optimice a menos que lo haya medido).

Vale la pena señalar que en el kernel de Linux empezaron a desalinear las funciones originalmente integradas hace algún tiempo porque el costo era demasiado alto (las funciones más grandes consumían más caché de la memoria de la CPU, y los errores de caché resultantes eran más caros que solo llamar a la función que estaban destinados a ser en línea). Consulte el "Capítulo 15: La enfermedad en línea" en doc/Documentation/CodingStyle para obtener más detalles.


En esa discusión, Jon Skeet menciona a Client jvm (hotspot) v Server jvm con las mejoras de rendimiento disponibles en tiempo de ejecución si se permite que el compilador JIT (justo a tiempo) traiga mejoras basadas en el tiempo. Eso es "cómo se hace" en Java.

Originalmente, las pequeñas secciones de código que no fueron llamadas desde muchos lugares serían "incorporadas" por el compilador, lo que significa que lo que se llamaba un singleton se colocaría directamente en la ruta del código del puntero de instrucción, haciendo una rama de función y los costos de retorno más potencia del procesador que simplemente desenrollar para realizar un bucle o función llamada y colocar las instrucciones "allí mismo"

Hoy en día, Singleton es el tema de las discusiones de varias páginas y el desenrollado de bucles, así como algo parecido a la inclusión en línea se eliminan de su contexto (s) original (es). Puede leer el trabajo muy informado de Dov Bulka sobre el tema para obtener la opinión de C / C ++ sobre el tema. Para Java, el estudio de sus bibliotecas enriquecidas en java.util serviría mejor a sus necesidades que el estudio de los problemas de compilación en línea y profundos: puede quedar atrapado en una guerra intramural en las estructuras de datos, que ocultan las llamadas a un código de 16 bits, y No te pongas fin a tu curva de aprendizaje.

Puede hacer instanceof en Java, que se asemeja a una vf-table (por favor, amigos), pero piénselo, ya que ha escrito en un lenguaje muy tipográfico, y ahora escribirá en un lenguaje en el que las cuerdas pueden saltar fácilmente Donde no tiene negocio. Recientemente intenté escribir código que construyera una imagen en Java, haciendo eso desde el código C. Pronto me encontré mirando la tabla oxr para un cifrado fuerte, que no tiene nada que ver con el código que estaba escribiendo.

¿Cómo escribiría una clase de cadena en C / C ++ que tiene un pequeño búfer para cadenas de menos de 32 bytes y captura los punteros para que solo funcionen en la cadena?

No intentar molestarlo ni nada, es un muy buen lugar para comenzar en lugar de en línea y compilación de ciencia.


La inclusión se refiere a la optimización en tiempo de compilación donde se inyectará una pequeña función de código en la función de llamada en lugar de requerir una llamada por separado.


Las funciones en línea se utilizan normalmente en los archivos de cabecera de C ++, no en Java. Un archivo de encabezado de C ++ generalmente no contiene el código implementado y se considera una interfaz para el archivo cpp del mismo nombre, que generalmente contiene el código implementado. Es legal incluir una función en línea en un archivo de encabezado, generalmente una función liviana pequeña. Las funciones en línea tienen un costo, por lo que no deberían ser grandes operaciones que requieren mucha memoria. Para las rutinas pequeñas, el impacto en el rendimiento es mínimo y se utilizan más por comodidad.


Las respuestas de optimización del compilador son correctas. Sin embargo, hay otro uso: en refactoring , en línea se refiere a reemplazar una llamada de método con el cuerpo del método y luego eliminar el método. Ver el método en línea . Hay refactorizaciones similares, como la clase en línea .

EDITAR: Tenga en cuenta que la refactorización se realiza manualmente o con una herramienta; en cualquier caso implica cambiar el código fuente.


http://en.wikipedia.org/wiki/Inlining

En computación, la expansión en línea, o en línea, es una optimización del compilador que reemplaza un sitio de llamada de función con el cuerpo de la persona que llama. Esta optimización puede mejorar el tiempo y el uso del espacio en tiempo de ejecución, al posible costo de aumentar el tamaño del programa final.


Norman Maurer explica en su blog funcionalidad en línea JVM y JIT de esa manera.

Inlining es una técnica que básicamente solo "inline" un método en otro y así deshacerse de una invocación de método. El JIT detecta automáticamente los métodos "calientes" e intenta alinearlos por ti. Un método se considera "activo" si se ejecutó más X veces, donde X es un umbral que puede configurarse utilizando un indicador JVM cuando se inicia java (10000 es el valor predeterminado). Esto es necesario, ya que la incorporación de todos los métodos haría más daño que cualquier otra cosa, debido al enorme byte-código producido. Además de esto, el JIT puede "revertir" el código en línea anterior cuando una optimización resulta ser incorrecta en un estado posterior. Recuerde que el JIT significa Just in Time y, por lo tanto, optimice (lo que incluye alineación pero también otras cosas) mientras ejecuta su código.

Tambien con una advertencia

Pero incluso si la JVM considera que un método está "activo", es posible que no lo incorpore. ¿Pero por qué? Una de las razones más probables es que es demasiado grande para estar en línea.

Y puede encontrar un ejemplo de código muy simple para incluir un código Java en Java World Post de Eva Andreasson . Puede encontrar la parte relacionada de la publicación a continuación.

Muchas optimizaciones intentan eliminar las instrucciones de salto a nivel de máquina (por ejemplo, JMP para arquitecturas x86). Una instrucción de salto cambia el registro de puntero de instrucción y, por lo tanto, transfiere el flujo de ejecución. Esta es una operación costosa en relación con otras instrucciones de MONTAJE, por lo que es un objetivo común para reducir o eliminar. Una optimización muy útil y bien conocida que se dirige a esto se llama alineación. Como el salto es costoso, puede ser útil incluir muchas llamadas frecuentes a pequeños métodos, con diferentes direcciones de entrada, en la función de llamada. El código Java en los listados 3 a 5 ejemplifica los beneficios de la alineación.

Listado 3. Método del llamante

int whenToEvaluateZing(int y) { return daysLeft(y) + daysLeft(0) + daysLeft(y+1); }

Listado 4. Método llamado

int daysLeft(int x){ if (x == 0) return 0; else return x - 1; }

Listado 5. Método en línea

int whenToEvaluateZing(int y){ int temp = 0; if(y == 0) temp += 0; else temp += y - 1; if(0 == 0) temp += 0; else temp += 0 - 1; if(y+1 == 0) temp += 0; else temp += (y + 1) - 1; return temp; }

En los Listados 3 a 5, el método de llamada hace tres llamadas a un método pequeño, que suponemos que para este ejemplo es más beneficioso para la línea que para saltar tres veces.

Es posible que no haya mucha diferencia en la inclusión de un método que se llama rara vez, pero la incorporación de un método llamado "caliente" que se llama con frecuencia podría significar una gran diferencia en el rendimiento. La inclusión también suele dar paso a otras optimizaciones, como se muestra en el Listado 6.

Listado 6. Después de ingresar, se pueden aplicar más optimizaciones.

int whenToEvaluateZing(int y){ if(y == 0) return y; else if (y == -1) return y - 1; else return y + y - 1; }