Articulo de referencia

Optimizador binario

Un optimizador binario toma la salida existente de un compilador y produce un archivo ejecutable mejor o código máquina optimizado en la memoria del programa, con la misma funci...

Un optimizador binario toma la salida existente de un compilador y produce un archivo ejecutable mejor o código máquina optimizado en la memoria del programa, con la misma funcionalidad.

Un optimizador binario , también conocido como optimizador de código objeto , toma el código objeto o el código máquina de un programa, ya sea de un archivo binario ejecutable enlazado o de la memoria del programa en ejecución, y produce secciones de código optimizado, invocadas mediante redirección o reemplazo de código, que son funcionalmente equivalentes pero con un mejor rendimiento. La aceleración del programa es un objetivo común de optimización. Algunos están diseñados para modernizar binarios antiguos y aprovechar mejor el hardware actualizado, [ 1 ] mientras que otros se basan en gran medida en la optimización guiada por perfiles y la optimización interprocedimental para lograr mejoras de rendimiento. [ 2 ] Algunos utilizan mecanismos de tiempo de ejecución para mejorar el rendimiento de forma introspectiva mediante técnicas similares a las de los compiladores JIT. [ 3 ]

Ejemplos

  • COBOL Optimizer fue desarrollado por Capex Corporation a mediados de la década de 1970 para COBOL . Este tipo de optimizador dependía, en este caso, del conocimiento de las "debilidades" del compilador estándar de IBM COBOL y, de hecho, reemplazaba (o parcheaba ) secciones del código objeto con código más eficiente. El código de reemplazo podía sustituir, por ejemplo, una búsqueda lineal en tabla por una búsqueda binaria o, a veces, simplemente reemplazar una instrucción relativamente lenta por otra más rápida que, por lo demás, era funcionalmente equivalente en su contexto. Esta técnica se conoce ahora como reducción de fuerza . Por ejemplo, en el hardware IBM/360, la CLIinstrucción era, según el modelo en particular, entre dos y cinco veces más rápida que una CLCinstrucción para comparaciones de un solo byte. [ 1 ] [ 4 ]

  • IBM Automatic Binary Optimizer para z/OS (ABO) optimiza los binarios COBOL antiguos para mejorar el rendimiento mediante el uso de instrucciones de hardware más recientes disponibles en los servidores IBM Z modernos. ABO no requiere la recompilación desde el código fuente de la aplicación. Esto permite que las aplicaciones COBOL antiguas alcancen un rendimiento comparable al que se obtendría al recompilarlas desde el código fuente con los compiladores más recientes, sin el riesgo de introducir cambios de comportamiento sutiles que podrían ocurrir al recompilar desde el código fuente con cadenas de herramientas más recientes. En algunos casos, es posible que los programas COBOL antiguos ni siquiera tengan disponible el código fuente original. [ 5 ]

  • Spike Executable Optimizer, desarrollado por Digital Equipment Corporation y posteriormente ampliado por Compaq , era un optimizador de ejecutables guiado por perfiles para binarios DEC Alpha en Windows NT y Tru64 Unix . Optimizaba la disposición del código y la reducción de bifurcaciones, junto con la precarga de caché de datos guiada por perfiles , se dirigía tanto al código ejecutable en modo usuario como en modo kernel, y proporcionaba mejoras de velocidad en varios programas, incluyendo hasta un 40 % de aceleración para Oracle Database ejecutando el benchmark TPC-C . No requería recompilación desde el código fuente e incluía Spike Optimization Environment (SOE) y Transparent Application Substitution (TAS) para gestionar la instrumentación de ejecutables, la recopilación de perfiles y la selección automática entre versiones instrumentadas y optimizadas de los binarios del sistema. [ 6 ] [ 7 ]

  • Solaris Binary Optimizer , anteriormente conocido como Sun Studio Binary Code Optimizer , fue desarrollado originalmente por Sun Microsystems y actualmente es mantenido y distribuido por Oracle Corporation como la herramienta binopt . Se puede utilizar para instrumentar y optimizar binarios x86-64 y SPARC para el sistema operativo Oracle Solaris . Sus principales optimizaciones son la inserción en línea guiada por perfil, la optimización de la disposición y las bifurcaciones del código (tanto en caliente como en frío), y la mejora de la ubicación y alineación de datos. Requiere binarios compilados con indicadores de compilador especializados. [ 8 ] [ 9 ]

  • El proyecto SOLAR incluyó tres herramientas distintas: ALTO para DEC Alpha , PLTO para x86 e ILTO para Itanium . Estas eran principalmente optimizadores de tiempo de enlace (LTO) que también podían funcionar como optimizadores binarios en ejecutables terminados. Tomaban archivos binarios ECOFF o ELF como entrada junto con datos de reubicación para reconstruir gráficos de flujo de control interprocedimentales. ALTO realizaba análisis y optimizaciones de programas completos y aplicaba técnicas como propagación de constantes, eliminación de código inalcanzable, inlining, diseño de código y planificación de instrucciones. Muchas de estas optimizaciones estaban guiadas por perfiles. [ 10 ] También se trabajó para lograr ahorros de energía priorizando la reducción de operaciones de memoria sobre las estimaciones de conteo de ciclos al dirigir las optimizaciones, ya que los accesos a memoria tienen un impacto desproporcionado en la energía. [ 11 ] PLTO se centró en la especialización guiada por perfiles de valor instrumentando ejecutables para recopilar perfiles de valor en constantes de tiempo de ejecución, luego clonando y optimizando rutas de código para valores frecuentes impulsados ​​por un análisis de costo-beneficio. [ 12 ] ILTO funcionaba desensamblando paquetes del código máquina de Itanium en grafos de flujo de control normalizados, recuperando información de predicado y especulación, y reescribiendo el código máquina para aplicar cambios de no predicado/no especulación, conversión if selectiva, planificación tardía, agrupamiento y diseño, para producir binarios más rápidos o más analizables. [ 13 ] Había un sistema llamado Squeeze , basado en ALTO , que era una herramienta de reescritura binaria para compactar binarios para la arquitectura Alpha sin reducir el rendimiento. Las huellas de código se redujeron a través de la factorización de código y la abstracción procedimental, lo que aumentó la reutilización de código para secuencias de instrucciones comunes. El análisis de vivacidad se utilizó para identificar y eliminar datos muertos de los ejecutables. [ 14 ] [ 15 ]

  • Dynamo fue un proyecto de investigación de Hewlett Packard Labs a finales de la década de 1990 que implementó un optimizador binario dinámico transparente para programas PA-RISC que se ejecutaban en el sistema operativo HP-UX . Dynamo funcionaba como un intérprete para binarios sin modificar que emitían los rastros más críticos del código máquina a una caché de código de software. Estos rastros se optimizaban reduciendo las ramificaciones, mejorando la localidad del código y aplicando propagación de copias , propagación de constantes , reducción de fuerza , movimiento de código invariante de bucle y desenrollado de bucles . Los binarios de destino debían volver a enlazarse a su versión personalizada del entorno de ejecución C estándar para cargar la biblioteca compartida de Dynamo. Debido a que funcionaba efectivamente como una máquina virtual ligera, tenía una amplia compatibilidad con el código en modo de usuario. Logró aceleraciones de hasta un 22 % en algunos benchmarks SpecInt95. [ 3 ] Posteriormente, Dynamo dio origen a DynamoRIO en colaboración con investigadores del MIT .

  • DynamoRIO es un marco de instrumentación binaria dinámica de código abierto que extiende el proyecto Dynamo original, admitiendo la optimización en tiempo de ejecución en múltiples arquitecturas y sistemas operativos. [ 16 ]

  • ADORE fue un proyecto de investigación que implementó un optimizador dinámico para binarios de Itanium sin modificar . Cargado en un proceso objetivo como una biblioteca compartida, generaba trazas de código optimizadas en una caché de código y aplicaba parches en vivo al código original a la versión optimizada. Este enfoque eliminó la sobrecarga del intérprete presente en Dynamo al permitir que el código original se ejecutara de forma nativa en su lugar antes de redirigir las regiones críticas a una caché de código optimizada. Aprovechó los contadores de rendimiento del hardware para realizar la precarga de software guiada por perfiles, logrando aceleraciones de hasta un 57 % en algunos benchmarks SPEC2000. [ 17 ]

  • COBRA fue un proyecto de investigación que también implementó un optimizador binario dinámico para ejecutables de Itanium en Linux con una arquitectura similar a ADORE , agregando principalmente detección de fase y reoptimización para adaptarse a cargas de trabajo cambiantes, con una aceleración de hasta el 68 % en un benchmark utilizando prefetching guiado por perfil . [ 18 ]

  • Dynimize es un optimizador binario dinámico para programas Linux x86-64 . Carga una caché de código en un proceso objetivo y utiliza compilación JIT de x86 a x86 más parcheo en caliente para aplicar optimizaciones de compilador guiadas por perfil, ejecutándose como un proceso separado de sus objetivos. Enfatiza cambios mínimos en el sistema sin modificar los binarios en el disco, no requiere recompilación desde el código fuente y no requiere que se reinicien los procesos objetivo. [ 19 ] Optimiza tanto el código ejecutable como el de biblioteca compartida en memoria, y v2 (beta) también optimiza los núcleos Linux no modificados y los controladores de dispositivos en memoria. [ 20 ] Es un optimizador binario dinámico de propósito general para cualquier programa que cumpla con sus requisitos de compatibilidad; sin embargo, el soporte comercial se limita al uso con bases de datos MySQL/MariaDB, [ 19 ] donde muestra aceleraciones de hasta el 55 %. [ 21 ]

  • BOLT es un optimizador post-enlace construido sobre el marco LLVM . Utilizando el perfilado basado en muestras, BOLT mejora el rendimiento de aplicaciones reales incluso para binarios altamente optimizados construidos con optimización dirigida por retroalimentación y optimización en tiempo de enlace . Para los compiladores GCC y Clang , BOLT acelera sus binarios hasta en un 20,4 % además de FDO y LTO, y hasta en un 52,1 % si los binarios se construyen sin FDO y LTO. Su uso de perfilado basado en muestras con una sobrecarga mínima ha hecho posible la implementación práctica de la optimización de binarios en todos los centros de datos de Meta. [ 2 ] También puede optimizar el kernel de Linux y se ha integrado en el proyecto LLVM . [ 22 ]

  • Propeller es un optimizador de re-enlace guiado por perfiles desarrollado por Google para aplicaciones a gran escala. Toma un binario completamente enlazado, junto con metadatos del enlazador y perfiles de tiempo de ejecución, asigna los PC muestreados a símbolos/bloques básicos y luego realiza optimizaciones de diseño de programa completo guiadas por perfiles sin necesidad de recompilar el código fuente. Se ha implementado en producción en los centros de datos de Google y se ha integrado en el Proyecto LLVM . Al utilizar perfiles basados ​​en muestras de baja sobrecarga recopilados de los binarios que está optimizando, puede aplicar optimizaciones de diseño de código guiadas por perfiles con mayor precisión que la optimización tradicional guiada por perfiles a partir del código fuente. [ 23 ]

Ventajas

Algunos optimizadores binarios permiten aplicar mejores optimizaciones del compilador a ejecutables donde no se dispone del código fuente, en algunos casos de forma instantánea y con un esfuerzo mínimo. [ 5 ] Pueden permitir una atribución de perfil más precisa cuando se aplican optimizaciones guiadas por perfil. [ 22 ] Se pueden aplicar optimizaciones de programa completo a ejecutables terminados, más allá del alcance de las unidades de compilación de código fuente tradicionales. [ 10 ] La optimización binaria dinámica permite una información de perfilado más precisa y flexible, especializando el código de la biblioteca compartida por proceso, y puede que no requiera cambios en los binarios en disco. [ 3 ]

Véase también

Referencias

  1. 1 2 "Información de temporización de instrucciones del sistema/360" (PDF) . Archivado del original (PDF) el 11 de julio de 2010. Recuperado el 7 de enero de 2010 .
  2. 1 2 Panchenko, Maksim; Auler, Rafael; Nell, Bill; Ottoni, Guilherme (16 de febrero de 2019). "BOLT: Un optimizador binario práctico para centros de datos y más allá". Simposio Internacional IEEE/ACM de 2019 sobre Generación y Optimización de Código (CGO) . págs. 2–14 . arXiv : 1807.06735 . doi : 10.1109/CGO.2019.8661201 . ISBN  978-1-7281-1436-1. S2CID 49869552 . 
  3. 1 2 3 "Optimización dinámica transparente: diseño e implementación de Dynamo" (PDF) . Archivado del original (PDF) el 3 de mayo de 2003.
  4. Evans, Michael (1982-12-01). "Ingeniería de software para el entorno Cobol" . Communications of the ACM . 25 (12): 874– 882. doi : 10.1145/358728.358732 . S2CID 17268690 . 
  5. 1 2 "IBM Automatic Binary Optimizer para z/OS" . IBM . Archivado del original el 16 de diciembre de 2025.
  6. Cohn, Robert S.; Goodwin, David W.; Lowney, P. Geoffrey (1997). "Optimización de ejecutables Alpha en Windows NT con Spike" (PDF) . Digital Technical Journal . 9 (4): 3–20 . Archivado del original el 16 de diciembre de 2025.
  7. Flower, Richard; Luk, Chi-Keung; Muth, Robert; Patil, Harish; Shakshober, John; Cohn, Robert; Lowney, P. Geoffrey (2001). "Optimizaciones del kernel y precarga con el optimizador ejecutable Spike con Spike" .
  8. "El optimizador de código binario" . Archivado del original el 22/07/2010 . Consultado el 07/01/2010 .
  9. "Optimizador binario de Oracle Solaris" . Archivado del original el 14 de septiembre de 2024.
  10. 1 2 Muth, R.; Debray, SK; Watterson, S.; De Bosschere, Koen (2001). "Alto: Un optimizador de tiempo de enlace para Compaq Alpha" (PDF) . Software—Práctica y experiencia . 31 (1): 67– 101. doi : 10.1002/1097-024X(200101)31:1 < 67::AID-SPE357 > 3.0.CO ; 2-A . Archivado del original (PDF) el 21-02-2008 . Recuperado el 17-12-2025 .
  11. Debray, Saumya; Muth, Robert; Watterson, Scott (2001). Optimización de potencia de software mediante reescritura binaria posterior al enlace (PDF) (Informe técnico). Departamento de Ciencias de la Computación, Universidad de Arizona . Recuperado el 29 de diciembre de 2025 .
  12. Schwarz, Benjamin William (2002). Post Link-Time Optimization on the Intel IA-32 Architecture (PDF) (Tesis de honor). Universidad de Arizona. Archivado del original (PDF) el 1 de marzo de 2006. Recuperado el 17 de diciembre de 2025 .
  13. Snavely, Noah. Optimización e ingeniería inversa de binarios de Itanium (PDF) (Tesis). Archivado del original (PDF) el 1 de marzo de 2006. Consultado el 17 de diciembre de 2025 .
  14. De Sutter, Bjorn; De Bus, Bruno; De Bosschere, Koen; Debray, Saumya. Combinación de código global y compactación de datos (PDF) . Departamento de Electrónica y Sistemas de Información, Universidad de Gante / Departamento de Ciencias de la Computación, Universidad de Arizona . Consultado el 29 de diciembre de 2025 .
  15. "Optimización de software "SOLAR" en tiempo de enlace y en tiempo de ejecución . Archivado del original el 14 de febrero de 2016.
  16. Bruening, Derek; Garnett, Timothy; Amarasinghe, Saman (2003). Una infraestructura para la optimización dinámica adaptativa . Simposio internacional sobre generación y optimización de código (CGO) . Recuperado el 13 de enero de 2026 .
  17. Lu, Jiwei; Chen, Howard; Fu, Rao; Hsu, Wei‑Chung; Othmer, Bobbie; Yew, Pen‑Chung (2003). El rendimiento de la precarga de caché de datos en tiempo de ejecución en un sistema de optimización dinámica (PDF) . MICRO 36 (36.º Simposio Internacional Anual IEEE/ACM sobre Microarquitectura). Archivado del original (PDF) el 5 de julio de 2024. Consultado el 18 de diciembre de 2025 .
  18. Kim, Jinpyo; Hsu, Wei-Chung; Yew, Pen-Chung (2007). "COBRA: Un marco de optimización binaria adaptativa en tiempo de ejecución para aplicaciones multihilo". Conferencia Internacional de Procesamiento Paralelo de 2007 (ICPP 2007) . pág. 25. doi : 10.1109/ICPP.2007.23 . ISBN  978-0-7695-2933-2. S2CID 15079211 . 
  19. 1 2 "Descripción general del producto Dynimize" . dynimize.com . Dynimize Inc. Archivado del original el 11 de agosto de 2025. Consultado el 18 de diciembre de 2025 .
  20. "Guía del usuario de Dynimize v2" . dynimize.com . Dynimize Inc. Archivado del original el 18/12/2025 . Consultado el 18/12/2025 .
  21. "Mejoras en el rendimiento de la CPU de MySQL y MariaDB con Dynimize" . dynimize.com . Dynimize Inc. Archivado del original el 23/06/2024 . Consultado el 18/12/2025 .
  22. 1 2 "OptimizingLinux.md" . GitHub . llvm/llvm-project. Archivado del original el 2 de agosto de 2025. Recuperado el 18 de diciembre de 2025 .
  23. Shen, Han; Pszeniczny, Krzysztof; Lavaee, Rahman; Kumar, Snehasish; Tallam, Sriraman; Li, Xinliang David (2023). Propeller: un optimizador de re-enlace guiado por perfil para aplicaciones a escala de almacén . Actas de la 28.ª Conferencia Internacional ACM sobre Soporte Arquitectónico para Lenguajes de Programación y Sistemas Operativos. ASPLOS '23. ACM. págs. 617–631 . Archivado del original el 2 de julio de 2025. Recuperado el 18 de diciembre de 2025 .