Have an amazing solution built in RAD Studio? Let us know. Looking for discounts? Visit our Special Offers page!
C++CodeNoticias

Guía de optimización de C ++ Builder con TwineCompile

34 banner blog jomitech cbuilder 660x300

En esta publicación, cubriremos consejos y trucos sobre cómo puede optimizar sus proyectos de C ++ Builder para compilar lo más rápido posible. Si bien definitivamente pasaremos algún tiempo buscando optimizaciones diseñadas para usar con TwineCompile, algunos de estos trucos se aplican a C ++ Builder en general.

C ++ Builder y TwineCompile incluyen muchas funciones diseñadas para optimizar la velocidad de compilación, pero a menudo deben ajustarse porque cada proyecto es único y tiene diferentes condiciones y configuración. Veremos varios consejos y cuándo y cómo aplicarlos a diferentes tipos de proyectos y estructuras.

Truco # 1 – TwineCompile

El primer truco es fácil: ¡comience a usar TwineCompile! TwineCompile es un complemento IDE que se integra en C ++ Builder y agrega múltiples subprocesos, almacenamiento en caché y otras potentes mejoras a los compiladores de C ++ Builder (tanto Classic como CLANG). En algunos casos, la simple instalación de TwineCompile hará que los proyectos se compilen 50 veces más rápido en estaciones de trabajo de compilación de última generación.

TwineCompile está disponible de forma gratuita para todos los usuarios de C ++ Builder 10.4.1+ con una Suscripción de actualización activa a través del Administrador de paquetes GetIt. Esta debería ser la primera parada en la búsqueda de tiempos de compilación más rápidos, ya que puede aprovechar estas mejoras de rendimiento sin necesidad de realizar un solo cambio en la estructura o los archivos de su proyecto (a diferencia de los siguientes consejos).

Para obtener TwineCompile, abra GetIt Package Manager en el IDE y busque TwineCompile. Siga las instrucciones para instalarlo.

La integración IDE de TwineCompile conectará automáticamente los comandos IDE Compile / Make / Build para invocar TwineCompile en lugar del proceso de construcción del IDE. Esto le permite seguir utilizando el IDE como lo hace hoy y aprovechar al máximo el rendimiento de compilación que ofrece TwineCompile.

picture1

TwineCompile Trick # 2 – CLANG Powered PCH (encabezados precompilados)

C ++ Builder ha tenido durante mucho tiempo un arma secreta que puede hacer magia en tiempos de compilación lentos. A menudo, la mejora más eficaz consiste en configurar y utilizar correctamente encabezados precompilados en un proyecto. La introducción del compilador CLANG mejoró significativamente esta funcionalidad y la hizo mucho más fácil de usar. Si su proyecto está utilizando actualmente el compilador CLANG, le recomiendo encarecidamente que aproveche el soporte de PCH en CLANG, ya que marcará una enorme diferencia en sus tiempos de compilación. Si su proyecto todavía usa el compilador Classic, recomendaría actualizarlo para usar el compilador CLANG; no solo obtendrá la capacidad de usar un compilador C ++ moderno y compatible con los estándares con soporte C ++ v17, sino que también podrá utilizar el sistema CLANG PCH.

banner c contest 1220x300 3913431 2

El concepto detrás de los encabezados precompilados es bastante simple: tome un conjunto de encabezados que se usan en la mayoría (si no en todas) las unidades de un proyecto y compílelas en una representación binaria. Cuando una unidad del proyecto incluye estos encabezados precompilados, el compilador no tiene que volver a procesar / compilar los encabezados desde cero, sino que simplemente puede cargar la representación precompilada desde el disco y pasar a compilar el código en la unidad. .

Se requiere cierta disciplina, ya que el orden del encabezado en cada unidad debe ser idéntico para garantizar que el compilador pueda utilizar el encabezado precompilado. Además, el encabezado precompilado no debe contener encabezados que se modifiquen con frecuencia, ya que la sobrecarga de compilar los encabezados es bastante significativa y perderá todas las ventajas del encabezado precompilado si tiene que reconstruirse todo el tiempo.

  1. Comience analizando su proyecto e identificando los encabezados que incluyen la mayoría de las unidades. Esto puede requerir cierta reorganización para hacer que la mayoría o todas las unidades incluyan el mismo conjunto de encabezados. Tenga en cuenta que, incluidos los

encabezados no tiene un efecto negativo, por lo que si algunas unidades no usan todos los encabezados, está perfectamente bien. Cuantos más encabezados estén precompilados, más eficaz será para mejorar los tiempos de compilación.

  • Si su proyecto ya tiene un archivo de encabezado PCH (como el archivo PCH .h generado automáticamente por el IDE para nuevos proyectos), salte al paso # 6.
  • Si su proyecto no tiene un archivo de encabezado PCH (como el archivo PCH .h generado automáticamente por el IDE para nuevos proyectos), agregue un nuevo archivo de encabezado al proyecto:
picture2
  • Guarde el nuevo archivo de encabezado con un nombre descriptivo como ProjectNamePCH.h
  • Haga clic con el botón derecho en el archivo de encabezado en el panel Proyectos y seleccione la opción Usar para precompilación:
picture3
  • Abra este archivo de encabezado precompilado y coloque todas las declaraciones de inclusión que recopiló en el paso n. ° 1. Por ejemplo:

#include  <vcl.h>

#include  <tchar.h>

  • Revise todas las unidades de su proyecto y elimine las declaraciones #include que se refieren a los encabezados ubicados en el encabezado PCH. En la parte superior de cada unidad, antes de cualquier otra declaración, coloque la siguiente declaración pragma para decirle al compilador que la unidad no está ajustando el encabezado precompilado:

#pragma  hdrstop

  • Abra las Opciones del proyecto, vaya a la sección Encabezados precompilados en C ++ Compiler y seleccione Generar y usar para la opción de uso de PCH
  • Construye el proyecto. Pasará algún tiempo compilando el archivo de encabezado PCH en la representación binaria, y luego las unidades subsiguientes se compilarán muchas veces más rápido, ya que estos encabezados ya no tendrán que procesarse para cada unidad una y otra vez.

Truco n. ° 3: PCH de encabezado único TwineCompile para el compilador clásico

Si su proyecto todavía usa el compilador Classic y no puede migrarlo al compilador CLANG más nuevo, aún es posible obtener ganancias significativas en la velocidad de compilación mediante el uso de encabezados precompilados debido a que el compilador clásico tiene un sistema PCH increíblemente poderoso. TwineCompile se ha creado para aprovechar al máximo este sistema y organiza el proceso de creación de modo que el compilador clásico se invoque automáticamente con los parámetros correctos para cada archivo que utiliza el encabezado precompilado.

A diferencia del compilador CLANG, el compilador clásico está diseñado para generar y usar el encabezado precompilado como parte de la compilación de los archivos fuente regulares. No se requiere ningún paso de compilación independiente para compilar un archivo que ha sido designado como archivo de encabezado precompilado.

Hay dos formas de configurar un proyecto para usar un PCH de un solo encabezado con el compilador clásico:

  1. Usar un comando de inyección para incluir automáticamente el archivo PCH de un solo encabezado en cada unidad como parte del proceso de compilación.
  2. Agregar manualmente la instrucción #include para el archivo PCH de encabezado único en la parte superior de cada unidad.

El primer enfoque es obviamente el más fácil, ya que se encarga de asegurarse de que el encabezado esté disponible en todas las unidades automáticamente. El segundo enfoque puede ser útil ya que el encabezado está incluido en cada unidad, por lo que está disponible para navegar y otros usos, como la herramienta de análisis de código.

  1. Al igual que con los pasos de CLANG, comience analizando su proyecto e identificando los encabezados que incluyen la mayoría de las unidades.

Esto puede requerir cierta reorganización para hacer que la mayoría o todas las unidades incluyan el mismo conjunto de encabezados. Tenga en cuenta que incluir encabezados adicionales no utilizados no tiene un efecto negativo, por lo que si algunas unidades no usan todos los encabezados, está perfectamente bien. Cuantos más encabezados estén precompilados, más eficaz será para mejorar los tiempos de compilación.

  • Cree un nuevo archivo de encabezado en su proyecto:
picture4
  • Guarde el nuevo archivo de encabezado con un nombre descriptivo como ProjectNamePCH.h
  • Abra este archivo de encabezado precompilado y coloque todas las declaraciones de inclusión que recopiló en el paso n. ° 1. Por ejemplo:

#include  <vcl.h>

#include  <tchar.h>

5a. Método A: si desea utilizar la funcionalidad de inyección, abra las Opciones del proyecto, vaya a la sección de encabezados precompilados en C ++ Compiler e ingrese el nombre del archivo de encabezado en la opción de encabezado de inyección:

picture6
  • Guarde el nuevo archivo de encabezado con un nombre descriptivo como ProjectNamePCH.h
  • Abra este archivo de encabezado precompilado y coloque todas las declaraciones de inclusión que recopiló en el paso n. ° 1. Por ejemplo:

#include  <vcl.h>

#include  <tchar.h>

5a. Método A: si desea utilizar la funcionalidad de inyección, abra las Opciones del proyecto, vaya a la sección de encabezados precompilados en C ++ Compiler e ingrese el nombre del archivo de encabezado en la opción de encabezado de inyección:

picture7
  • Construye el proyecto. TwineCompile ajustará automáticamente las opciones del compilador para los archivos que se están compilando para que el archivo PCH se genere y se utilice como parte del proceso de compilación, con una mejora significativa en los tiempos de compilación.

Truco n. ° 4: PCH automático TwineCompile para el compilador clásico

Para los proyectos que no se pueden migrar al compilador CLANG y no tienen la estructura del proyecto para admitir un solo archivo PCH que funcione para todas las unidades, la esperanza no se pierde. Existe alguna funcionalidad PCH avanzada en el compilador Classic, junto con TwineCompile, que proporciona la mayoría de las ventajas de rendimiento de un encabezado precompilado ajustado para este tipo de proyectos. El compilador Classic admite el concepto de un encabezado precompilado “adaptable” (mis palabras, no la descripción oficial) que se crea y ajusta continuamente como parte de la construcción de un proyecto para respaldar el

diferentes variaciones de encabezados que pueden utilizar las unidades del proyecto. El truco es hacer que funcione en su proyecto y ahí es donde entra TwineCompile.

  1. Abra las Opciones del proyecto, vaya a la sección de encabezados precompilados en C ++ Compiler:

1a. Seleccione la opción Generar y usar para el uso de PCH. Tenga en cuenta que este proyecto no tiene ningún tipo de estructura PCH, por lo que normalmente esta opción causaría más problemas de los que resuelve.

1b. Seleccione la opción Caché de encabezados precompilados.

1c. Ingrese un nombre para el archivo PCH generado en la opción Nombre de archivo PCH. Por ejemplo: Project.csm. Este archivo contendrá los datos binarios compilados a partir del encabezado seleccionado como encabezado precompilado.

Las opciones deberían verse así:

picture8
  • Abra las Opciones de TwineCompile desde el menú TwineCompile, vaya a Encabezados precompilados y seleccione la opción “Usar archivo PCH para cada hilo”. Haga clic en Aceptar.
picture9
  • Construye el proyecto. TwineCompile ajustará automáticamente las opciones del compilador para cada archivo para que puedan generar y utilizar un archivo PCH que se adaptará a las diferentes variaciones de los encabezados incluidos en cada unidad. El rendimiento no será tan bueno como una configuración adecuada de PCH, pero será significativamente mejor que si no se utilizara PCH.

Truco n. ° 5 de TwineCompile: optimizar el diseño de su proyecto

O para poner este truco de otra manera: minimizar la cantidad de archivos que deben compilarse cuando se realiza un cambio, pero equilibrando eso con el tiempo necesario para vincular.

Una táctica común utilizada para optimizar los tiempos de compilación de C ++ es dividir los proyectos en muchas bibliotecas o paquetes pequeños. La idea es que cuando se cambia cualquier código, solo se deben volver a compilar los pocos archivos de este proyecto. La biblioteca recompilada se puede volver a vincular con las otras bibliotecas para formar el resultado final.

Hay dos razones por las que esto suele ser una mala idea, especialmente si está utilizando TwineCompile:

  1. Está intercambiando tiempo de compilación con tiempo de enlace. Los consejos que recomiendan este enfoque generalmente están orientados a compiladores de C ++ más lentos como gcc, donde el tiempo de enlace es mucho más rápido que los tiempos de compilación muy lentos. Por tanto, puede resultar útil descargar el trabajo al enlazador. Los compiladores de C ++ Builder (tanto CLANG como Classic) son bastante rápidos para los compiladores de C ++, por lo que agregar 15 pasos de enlace para evitar compilar 30 archivos C ++ a menudo resulta en una pérdida significativa de rendimiento.
  • La vinculación es un proceso en serie. La compilación es paralela. Cuando utiliza TwineCompile, los archivos C ++ se compilan en paralelo, por lo que cuantas más unidades se puedan compilar simultáneamente, mayor rendimiento se obtendrá. Un solo proyecto con 200 unidades C ++ y un solo paso de enlace se compilará muchas veces más rápido que 10 proyectos con 20 unidades C ++, cada uno con su propio paso de enlace.

Como ocurre con la mayoría de las cosas en la vida, existe una compensación en la que una estructura de proyecto dividida tiene sentido. Desafortunadamente, no existe una única respuesta correcta sobre cómo debe estructurarse un proyecto, así que te dejo con las siguientes pautas:

  1. Minimice la cantidad de archivos que deben compilarse para cualquier cambio en la fuente.
  2. Minimice la cantidad de bibliotecas, paquetes o aplicaciones que deben vincularse. Incluso las bibliotecas estáticas, aunque son bastante rápidas de vincular, tienen una sobrecarga.
  3. Maximice los recursos de su procesador. El enlazador solo usará un núcleo, 16 archivos C ++ en un procesador de 8 núcleos + HT usará los 16 núcleos lógicos. Por lo tanto, compilar esos 16 archivos puede usar 16 veces más recursos que el vinculador.

Truco # 6 – Compilación SORTA

Una de las características más poderosas de TwineCompile es su sistema automático de compilación en segundo plano. Esencialmente, esta función compila automáticamente sus archivos de código fuente modificados en segundo plano, de modo que cuando hace clic en Crear o Ejecutar, no hay archivos para compilar, todo está actualizado y el proceso de compilación solo tiene que vincular la aplicación.

A diferencia de muchos de los trucos anteriores, este no está directamente relacionado con hacer que el proceso de compilación o construcción sea más rápido, sino que tiene como objetivo reducir o incluso eliminar la necesidad de compilar el código fuente.

Para habilitar SORTA Compile, abra las Opciones de TwineCompile, vaya a la sección SORTA Compile y seleccione la opción Habilitar SORTA Compile:

picture10

Hay una serie de activadores que se utilizan para invocar esta funcionalidad, incluso cuando se guarda una unidad, cuando cambia la pestaña del editor o cuando se modifica un archivo y no se toca durante un período de tiempo.

El uso efectivo de SORTA Compile requiere un ajuste en el flujo de trabajo de codificación, pero puede brindar enormes beneficios al proceso tradicional de evolución del proyecto de cuatro pasos: editar, compilar, ejecutar, probar, repetir.

Truco de TwineCompile n. ° 7: vinculación estática frente a vinculación dinámica

Si aplica los trucos mencionados anteriormente a sus proyectos, probablemente encontrará que comenzará a esperar al vinculador todo el tiempo. La espera del compilador desaparecerá por completo. Esto es tanto bueno como malo. Bueno porque es

significa que está ahorrando todo este tiempo, mal porque no hay mucho más que pueda hacer para optimizar el rendimiento de la compilación.

Dicho esto, algunas aplicaciones se pueden reestructurar para poner diferentes piezas de funcionalidad en archivos DLL separados que la aplicación carga en tiempo de ejecución. Esto significa que cuando se realizan cambios de código en una determinada parte de la aplicación, solo ese código específico se compila y se vincula a su propio archivo DLL. No es necesario reconstruir el resto de la aplicación porque se vincula a esta DLL en tiempo de ejecución.

Obviamente, este enfoque agrega la sobrecarga de implementación y administración de archivos DLL adicionales que deben incluirse con la aplicación, pero los ahorros en el rendimiento de la compilación a menudo pueden valer la pena la sobrecarga adicional.

Truco # 6 – Hardware

Nuestro último truco es un truco antiguo y bien conocido, a menudo conocido como “lanzar hardware al problema”. Si bien el hardware más nuevo y más rápido en el pasado solo brindaba beneficios menores, los últimos avances de hardware de la actualidad, junto con la capacidad de TwineCompile para maximizar el uso de los recursos del sistema, pueden brindar algunos beneficios significativos.

Hay dos áreas clave en las que debería centrarse:

1. Rendimiento del disco

Esto significa unidades SSD que utilizan conexiones NVMe / PCIe. Los SSD SATA son buenos, pero carecen del rendimiento de acceso aleatorio de los SSD que operan a través del bus PCIe.

Los husillos son definitivamente un no-no. Si sus proyectos, directorios temporales, sistema operativo o ruta de instalación de C ++ Builder están en un eje, su rendimiento de compilación será abismal.

2. núcleos de CPU

El rendimiento de un solo núcleo en línea recta para la compilación de C ++ es menos útil en estos días que tener muchos núcleos. Elija el número máximo de núcleos disponibles.

Los procesadores AMD Threadripper con 64 núcleos (128 subprocesos) son ideales para la compilación de C ++ en C ++ Builder con TwineCompile. Tenga en cuenta que para un procesador como este, si tiene menos de 128 archivos C ++ en su proyecto, está desperdiciando recursos de la CPU; esto se remonta al punto que hicimos en el Truco n. ° 5 sobre la optimización del diseño de su proyecto para maximizar el uso de la CPU. recursos compilando muchos archivos en el mismo proyecto.

Pensamientos finales

Hemos recorrido un largo camino desde los viejos tiempos de la compilación en C ++ cuando las compilaciones tomaban mucho tiempo y no había nada que se pudiera hacer al respecto. Se han desarrollado herramientas y técnicas que marcan una diferencia significativa en proyectos de todos los tamaños. Hemos cubierto varios de estos en esta publicación y esperamos que pueda aplicarlos a sus propios proyectos para hacer que su experiencia de desarrollo de C ++ sea más rápida, más simple y más fácil.


RAD Studio C ++ Builder, ¿por qué no probarlo hoy?


Reduce development time and get to market faster with RAD Studio, Delphi, or C++Builder.
Design. Code. Compile. Deploy.
Start Free Trial   Upgrade Today

   Free Delphi Community Edition   Free C++Builder Community Edition

Leave a Reply

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

IN THE ARTICLES