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 dpero 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 dEliminació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 AFSi 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 AFLa 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 AFVéase también
- Optimizadores de código objeto , discusión en relación con la eficiencia algorítmica general.
- Capex Corporation : produjo el optimizador COBOL , un optimizador de código objeto para mainframes de IBM Cobol.
- Superoptimización
- Digital Research XLT86 , un compilador optimizador de código fuente a código fuente en lenguaje ensamblador.
Referencias
- 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 .
- ↑ 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.
- ^ 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.
- ↑ 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 .
- ↑ 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 .
Enlaces externos
- El optimizador de mirillas de propósito general copt de Christopher W. Fraser
- El documento original
La definición de optimización de mirilla en Wikcionario
- Optimizaciones del compilador