Articulo de referencia

Optimización de mirillas

La optimización de mirilla es una técnica de optimización que se realiza en un pequeño conjunto de instrucciones generadas por el compilador , conocido como mirilla o ventana, [...

La optimización de mirilla es una técnica de optimización que se realiza en un pequeño conjunto de instrucciones generadas por el compilador , conocido como mirilla o ventana, [ 1 ] : 549 [ 2 ] [ 3 ] que implica reemplazar las instrucciones con un conjunto lógicamente equivalente que tiene un mejor rendimiento.

Por ejemplo:

  • En lugar de insertar un registro en la pila y luego recuperar inmediatamente el valor del registro, elimine ambas instrucciones.
  • En lugar de multiplicar x por 2, haz x << 1.
  • En lugar de multiplicar un registro de punto flotante por 8, suma 3 al exponente del registro de punto flotante.

El término optimización de mirilla fue introducido por William Marshall McKeeman en 1965. [ 4 ]

Repuestos

Las alternativas de optimización de mirillas incluyen, entre otras: [ 5 ]

  • Secuencias nulas: eliminan las operaciones inútiles.
  • Combinar operaciones: sustituir varias operaciones por una equivalente.
  • Leyes algebraicas: utilice las leyes algebraicas para simplificar o reordenar las instrucciones.
  • Instrucciones para casos especiales: utilice las instrucciones diseñadas para casos de operandos especiales.
  • Operaciones en modo direccional: utilice los modos direccionales para simplificar el código.

Implementación

Los compiladores modernos suelen implementar optimizaciones de tipo "peephole" con un algoritmo de coincidencia de patrones . [ 1 ] : 540

Ejemplos

Sustituir las instrucciones lentas por otras más rápidas.

El siguiente código de bytes de Java :

carga 1 carga 1 mul

puede sustituirse por lo siguiente, que se ejecuta más rápido:

carga 1 duplicado mul

Como ocurre con la mayoría de las optimizaciones de peephole, esta se basa en la eficiencia relativa de diferentes instrucciones. En este caso, se sabe/supone que dup(que duplica y coloca el elemento superior de la pila ) es más eficiente que (que carga una variableaload local y la coloca en la pila).

Eliminación de código redundante

El siguiente código fuente :

a = b + c; d = a + e;

se compila de forma sencilla para

MOV b , R0 ; Copia b al registro ADD c , R0 ; Suma c al registro, el registro ahora es b+c MOV R0 , a ; Copia el registro a MOV a , R0 ; Copia a al registro ADD e , R0 ; Suma e al registro, el registro ahora es a+e [(b+c)+e] MOV R0 , d ; Copia el registro d

pero se puede optimizar para

MOV b , R0 ; Copia b al registro ADD c , R0 ; Suma c al registro, que ahora es b+c (a) MOV R0 , a ; Copia el registro a a ADD e , R0 ; Suma e al registro, que ahora es b+c+e [(a)+e] MOV R0 , d ; Copia el registro a d

Eliminación de instrucciones de pila redundantes

Si el compilador guarda los registros en la pila antes de llamar a una subrutina y los restaura al regresar, las llamadas consecutivas a subrutinas pueden tener instrucciones de pila redundantes.

Supongamos que el compilador genera las siguientes instrucciones Z80 para cada llamada a procedimiento:

PUSH AF PUSH BC PUSH DE PUSH HL LLAMADA _ADDR POP HL POP DE POP BC POP AF

Si hubiera dos llamadas a subrutinas consecutivas, se verían así:

PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR1 POP HL POP DE POP BC POP AF PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR2 POP HL POP DE POP BC POP AF

La secuencia POP regsseguida PUSHpara los mismos registros suele ser redundante. En los casos en que lo sea, una optimización de peephole eliminaría estas instrucciones. En el ejemplo, esto provocaría que apareciera otro par POP/ redundante en el peephole, y estos se eliminarían a su vez. Suponiendo que la subrutina no dependa de valores de registro anteriores, eliminar todo el código redundante del ejemplo anterior dejaría finalmente el siguiente código:PUSH_ADDR2

PUSH AF PUSH BC PUSH DE PUSH HL CALL _ADDR1 CALL _ADDR2 POP HL POP DE POP BC POP AF

Véase también

Referencias

  1. 1 2 Aho, Alfred Vaino ; Lam, Monica Sin-Ling ; Sethi, Ravi ; Ullman, Jeffrey David (2007). "Capítulo 8.9.2 Generación de código mediante la segmentación de un árbol de entrada". Compiladores: principios, técnicas y herramientas (PDF) (2.ª  ed.). Pearson Education . Archivado (PDF) del original el 10 de junio de 2018. Recuperado el 2 de julio de 2018 .
  2. Muchnick, Steven Stanley (15 de agosto de 1997). Diseño e implementación avanzados de compiladores . Academic Press / Morgan Kaufmann . ISBN 978-1-55860-320-2.
  3. ^ Grune, Dick ; Bal, Enrique ; Jakobs, Ceriel; Langendoen, Koen (20 de julio de 2012). Diseño de compilador moderno (2 ed.). Wiley / John Wiley & Sons, Ltd. ISBN  978-0-471-97697-4.
  4. McKeeman, William Marshall (julio de 1965). "Optimización de mirillas" . Communications of the ACM . 8 (7): 443– 444. doi : 10.1145/364995.365000 . S2CID 9529633 . 
  5. Fischer, Charles N.; Cytron, Ron K.; LeBlanc, Jr., Richard J. (2010). Crafting a Compiler (PDF) . Addison-Wesley . ISBN 978-0-13-606705-4. Archivado del original (PDF) el 03-07-2018 . Consultado el 02-07-2018 .
  • El optimizador de mirillas de propósito general copt de Christopher W. Fraser
  • El documento original

Logotipo de WikcionarioLa definición de optimización de mirilla en Wikcionario