2 puntos por GN⁺ 2023-11-11 | 1 comentarios | Compartir por WhatsApp

Compilación más rápida de Rust con el frontend paralelo del compilador de Rust

  • El frontend del compilador de Rust puede reducir significativamente los tiempos de compilación al usar ejecución en paralelo.
  • El frontend paralelo es una función experimental y se puede probar en el compilador nightly con la opción -Z threads=8.
  • Está previsto que llegue al compilador estable en 2024.

Tiempo de compilación y paralelismo

  • El tiempo de compilación en Rust ha sido una preocupación constante, y el grupo de trabajo de rendimiento del compilador ha mejorado su desempeño de forma continua durante varios años.
  • En los primeros 10 meses de 2023, el tiempo de compilación se redujo en promedio 13%, el uso de memoria 15% y el tamaño de los binarios 7%.
  • El compilador ya está muy optimizado, por lo que se ha vuelto más difícil encontrar nuevas mejoras, y el paralelismo sigue siendo una mejora importante pero compleja.

Paralelismo existente entre procesos

  • Al compilar un programa de Rust, Cargo ejecuta en paralelo varios procesos de rustc para compilar múltiples crates.
  • La ejecución en paralelo funciona bien cuando hay pocas dependencias entre crates, pero disminuye a medida que aumentan las dependencias.

Paralelismo existente dentro del proceso: backend

  • El compilador se divide en frontend y backend; el backend se encarga de la generación de código y LLVM la procesa en paralelo.
  • El frontend realiza tareas como parsing y verificación de tipos, pero hasta esta semana no podía usar ejecución en paralelo.

Nuevo paralelismo dentro del proceso: frontend

  • El frontend ahora puede realizar tareas de compilación con paralelismo de grano fino usando Rayon.
  • Cuando se activa el frontend paralelo y se configura para usar 8 hilos, se puede ver una reducción importante en el tiempo de ejecución del frontend.

Integración general

  • La compilación de Rust ya se beneficiaba desde hace tiempo del paralelismo entre procesos mediante Cargo y del paralelismo dentro del proceso en el backend, y ahora también puede aprovechar el paralelismo dentro del proceso en el frontend.
  • El compilador usa el protocolo jobserver para limitar la cantidad de hilos creados y no superar el número de núcleos disponibles.

Cómo usarlo

  • El compilador nightly se lanzó con el frontend paralelo activado, pero por defecto se ejecuta en modo de un solo hilo.
  • Los usuarios pueden cambiar al modo multihilo con la opción -Z threads.

Impacto en el rendimiento

  • Ejecutar el frontend paralelo en modo de un solo hilo puede hacer que el tiempo de compilación sea entre 0% y 2% más lento que antes.
  • En modo multihilo, el tiempo de compilación puede reducirse hasta en 50%, aunque el efecto varía según las características del código y la configuración de compilación.

Corrección

  • En modo de un solo hilo, se espera una alta confiabilidad.
  • En modo multihilo puede haber bugs conocidos y deadlocks, y los binarios generados por el compilador deben ser iguales sin importar qué frontend se use.

Retroalimentación

  • Si hay problemas con el frontend paralelo, se pueden revisar los issues con la etiqueta "WG-compiler-parallel" y enviar nuevos reportes.

Trabajo futuro

  • Se sigue trabajando en mejorar el rendimiento del frontend paralelo y en corregir los bugs del modo multihilo.
  • El plan es estabilizar la opción -Z threads para que en 2024 la versión estable se ejecute por defecto en modo multihilo.

Opinión de GN⁺

Lo más importante de este artículo es que el frontend del compilador de Rust ahora admite ejecución en paralelo, lo que puede reducir significativamente los tiempos de compilación. Esto representa una gran ventaja para los desarrolladores de Rust al mejorar la velocidad de compilación y contribuir a un entorno de desarrollo más eficiente. La introducción del frontend paralelo es una noticia interesante para la comunidad de Rust y puede verse como el resultado de esfuerzos continuos por mejorar el rendimiento.

1 comentarios

 
GN⁺ 2023-11-11
Opiniones de Hacker News
  • Expectativa por la mejora en la velocidad de compilación de Rust
    • La lentitud de compilación de Rust suele señalarse como una desventaja, especialmente al trabajar en repositorios grandes, donde aumenta los costos de CI/CD y retrasa el tiempo de desarrollo. Es un problema aún mayor cuando hay que limpiar la caché (algo que a veces pasa por bugs de Docker). Reacción positiva ante este avance.
  • Experiencia personal con la velocidad de compilación de Rust
    • Cuando usó Rust hace mucho tiempo, la compilación era lenta, pero al volver a usarlo recientemente casi dejó de prestar atención a los tiempos de compilación. Aun así, cuando el proyecto crece se empiezan a notar las demoras, así que esta mejora le parece una muy buena noticia.
  • Pregunta sobre el proceso de compilación de Rust
    • Pregunta sobre si el frontend de Rust debe terminar la comprobación de préstamos antes de que el backend pueda empezar a trabajar. También plantea si, en caso de errores de borrow checking, el backend podría descartar trabajo especulativo.
  • Observación sobre la compilación de crates binarios en Rust
    • A diferencia de los crates de librería, los crates binarios suelen ser grandes y tener una estructura monolítica, por lo que tienden a no paralelizarse en la compilación y el crate más grande acaba serializándose. Se celebra que haya mejoras para este problema.
  • Pregunta sobre el uso de núcleos de CPU
    • Pregunta sobre si es posible hacer que durante la compilación se usen automáticamente todos los núcleos de CPU, o si hay que poner un valor fijo en un archivo de configuración que luego también se use en otras máquinas.
  • Advertencia sobre bugs en el modo multihilo
    • Hay bugs y deadlocks conocidos en el modo multihilo, y si la compilación se queda colgada es posible que se haya topado con uno de esos problemas. Se muestra cautela con el uso de la opción -Z threads.
  • Evaluación positiva del estado actual de la velocidad de compilación de Rust
    • Después de no usar Rust durante algunos años, al volver a probarlo recientemente la velocidad de compilación se siente casi instantánea. Además, herramientas como ChatGPT facilitan resolver problemas de Rust que antes eran difíciles, así que el estado actual parece muy bueno.
  • Duda sobre la dirección de la optimización de compilación en Rust
    • Existe preocupación de que, si la compilación de Rust ya está muy paralelizada a nivel de archivos, acelerar la compilación de un solo archivo pueda quitar recursos a la paralelización de archivos de nivel superior. Se señala como problema la falta de datos concretos al respecto.
  • Comentario de bienvenida a la mejora en la velocidad de compilación de Rust