Pregunta

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

¿Fue útil?

Solución

Al ejecutar una determinada pieza de código, cada vez que se llama a una función estándar del tiempo de ejecución es ligeramente más alto que el dumping existe el código contenido en esa función. El dumping cada vez que todo el código contenido en una función está en el otro extremo unmainteinable porque obviamente conduce a un lío de la duplicación de código.

Inlining soluciona el problema de rendimiento y facilidad de mantenimiento al permitir que se declara la función como línea (al menos en C ++), de manera que cuando se llama a esa función - en lugar de tener su aplicación saltando en tiempo de ejecución -. el código de la función en línea se inyecta en tiempo de compilación cada vez que la función dada se llama

Lo malo de esto es que - si usted inline grandes funciones que se llama a un montón de veces - el tamaño de su programa puede aumentar significativamente ( las mejores prácticas sugerir que hacerlo sólo en pequeñas funciones de hecho) .

Otros consejos

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

En la informática, la expansión en línea, o procesos en línea, es una optimización del compilador que reemplaza un sitio llamada a la función con el cuerpo del destinatario de la llamada. Esta optimización puede mejorar el tiempo y el uso del espacio en tiempo de ejecución, aún a costa de aumentar el tamaño del programa final.

Como desarrollador de Java, por lo general, no tiene que preocuparse de procesos en línea método. de Java compilador Just-In-Time puede y lo hará automáticamente en la mayoría de los lugares donde tiene sentido.

IDEs como Eclipse pueden tener una característica que le permite Inline métodos a nivel de código fuente - no hacer esto para el rendimiento, sólo para la legibilidad del código (por ejemplo, cuando se da cuenta de que el método sólo llama a uno otro método sin añadir nada en sí útil).

Norman Maurer explica en su Blog funcionalidad JVM y JIT en línea como esa

  

Inlining es una técnica que, básicamente, sólo "en línea" un método en otro y así deshacerse de una invocación de método. El JIT detecta automáticamente métodos "calientes" y tratar de inline para usted. Un método se considera "caliente" si se ha ejecutado más los tiempos de X, donde X es un umbral que puede ser configurado usando una bandera de JVM cuando la puesta en marcha de java (10000 es el valor predeterminado). Esto es necesario ya que todos los métodos inlining haría más daño que cualquier otra cosa, debido a la enorme código de bytes producido. Junto a esto el JIT puede "volver" código inline anterior cuando una optimización resulta ser equivocado en un estado posterior. Recuerde que el JIT significa Justo a Tiempo y así optimizar (que incluye procesos en línea, sino también otras cosas), mientras que ejecutar su código.

También con una advertencia

  

Pero incluso si la JVM consideran un método que es "caliente" puede que no se inline. ¿Pero por qué? Una de las razones más probables es que es sólo para grande como para inline.

Y se puede encontrar un ejemplo muy simple código para inlining un código de Java en el Eva Andreasson 's Java Mundial del Correo . Puede encontrar la parte correspondiente del puesto de abajo.

  

Muchas optimizaciones tratan de eliminar las instrucciones de nivel de equipo de salto (por ejemplo, JMP para arquitecturas x86). Una instrucción de salto cambia el registro del puntero de instrucción y con ello 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 de reducir o eliminar. Una optimización muy útil y bien conocida que se dirige a esto se llama procesos en línea. Desde el salto es caro, puede ser útil para inline muchas llamadas frecuentes a métodos pequeñas, con diferentes direcciones de entrada, en la función de llamada. El código Java en los listados del 3 al 5 ejemplifica los beneficios de procesos en línea.

Listado 3. Método de llamadas

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. inlined método

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 Listados 3 a 5 del método de llamada hace tres llamadas a una   pequeña método, que suponemos por el bien de este ejemplo es más   beneficioso para inline que saltar tres veces.

     

Puede que no hay mucha diferencia a inline un método que se llama   rara vez, pero inlining un método llamado "caliente" que es con frecuencia   llamada podría significar una gran diferencia en el rendimiento. también inlining   con frecuencia hace camino para nuevas optimizaciones, como se muestra en el Listado 6.

Listado 6. Después de procesos en línea, más optimizaciones pueden aplicarse

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

Como ya se ha mencionado en otras respuestas, procesos en línea viene con un costo. Por lo general, esto se considera pequeña, sin embargo, cuando la medición real puede que se sorprenda y aprender que podría ser mayor de lo que ganas (de modo lo que otras personas dicen es cierto:. no optimice a menos que haya medido)

Es importante señalar que en el núcleo de Linux comenzaron un-inline funciones inline originalmente hace algún tiempo ya que el coste era demasiado alto (funciones más grandes consumen más de la memoria caché de la CPU, y los fallos de caché resultantes eran más caros que simplemente llamando a la función que se pretende ser inline). Consulte el "Capítulo 15: La enfermedad en línea" en doc / Documentación / proceso / codificación-style.rst para más detalles.

Básicamente, en C / C ++, el compilador puede inline funciones, lo que significa que en lugar de hacer una llamada a la función de hacer esa operación, se añadirá el código de bloqueo de la función de llamada, por lo que será como si nunca tuvo sido una llamada a una función separada.

Esto entrar en más detalles: http://www.codersource.net/cpp_tutorial_inline_functions.html

Inlining se refiere a tiempo de compilación de optimización en el que se inyecta una pequeña función de código en la función de llamada en lugar de requerir una llamada separada.

La optimización del compilador respuestas son correctas. Hay otro uso, sin embargo - en refactorización , inlining se refiere a la sustitución de una llamada a un método con el cuerpo del método y después eliminando el método. Ver Inline Método . Hay refactorizaciones similares, tales como Inline Clase .

EDIT: Tenga en cuenta que la refactorización se realiza manualmente o con una herramienta; en ambos casos se trata de cambiar el código fuente.

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

En esa discusión, Jon Skeet menciones cliente JVM (hotspot) JVM v Servidor con las mejoras de rendimiento disponibles en tiempo de ejecución si se permite que el compilador JIT (just-in-time) para traer mejoras basadas en el tiempo. Es decir "cómo se hace" en Java.

Originalmente, pequeñas secciones de código que no fueron llamados de muchos lugares serían "inline" por el compilador, lo que significa que lo que se llama un singleton se coloca directamente en la ruta de código puntero de instrucción, haciendo una rama función y los gastos de devolución mayor potencia de proceso que sólo se desenrolla a lazo o llamada a la función y la colocación de las instrucciones "justo ahí"

Hoy en día, Singleton es objeto de discusiones de varias páginas y bucle desenrollado, así como algo así como procesos en línea son un tanto retirado de su contexto original (s). Usted puede leer un trabajo muy informado de Dov Bulka en la materia para obtener la C / C ++ tomar al respecto. Para Java, el estudio de su rica del lib en java.util servirían mejor a sus necesidades de estudio de las cuestiones procesos en línea y compilador de profundidad - se puede quedar atascado en la guerra intramural asediado arraigada en las estructuras de datos, que pasan por alto las llamadas a código de 16 bits, y ir a ningún extremo en su curva de aprendizaje.

Puede hacer instanceof en Java, que se asemeja a un VF-mesa (no hay gente de calor, por favor), pero piensa en él como usted ha estado escribiendo en un lenguaje fuertemente tipado - y ahora será escrito en un lenguaje donde cadena puede fugitivo fácilmente a hurgar donde no tiene negocios. Recientemente he tratado de escribir código que construye una imagen en Java, haciendo que a partir del código C. Pronto me encontré mirando a la mesa OXR para el cifrado fuerte - que no tiene nada que ver con el código que estaba escribiendo.

¿Cómo escribir una clase cadena en C / C ++ que tiene una pequeña memoria intermedia para las cadenas de menos de 32 bytes y trampas punteros para que sólo operan en la cadena?

No estamos tratando de molestar ni nada, es sólo un muy buen punto de partida en vez de inline y la ciencia compilador.

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