Copilot Studio se acelera con .NET 10 en WebAssembly

Copilot Studio se acelera con .NET 10 en WebAssembly

El equipo de Microsoft Copilot Studio ha dado un paso significativo en su compromiso con el rendimiento y la innovación, actualizando su motor .NET WebAssembly (WASM) a la versión .NET 10. Este avance se produce después de haber compartido previamente cómo Copilot Studio aprovecha C# en el navegador mediante .NET WASM, destacando las mejoras de rendimiento ya obtenidas al pasar de .NET 6 a .NET 8. Esta última migración a .NET 10 no solo fue sorprendentemente fluida, sino que también ha traído consigo una serie de optimizaciones cruciales que simplifican el despliegue y, lo más importante, aceleran la experiencia del usuario final.

La historia de Copilot Studio con .NET y WebAssembly es un testimonio del poder de ejecutar código C# directamente en el navegador. Esta estrategia permite a los desarrolladores de Microsoft entregar experiencias ricas y complejas con la familiaridad y eficiencia del ecosistema .NET. Con cada nueva versión de .NET, el equipo busca no solo mantener, sino superar los límites de lo que es posible en las aplicaciones web modernas. La reciente actualización a .NET 10 es un claro ejemplo de este ciclo de mejora continua, demostrando cómo pequeñas evoluciones en la plataforma pueden traducirse en grandes ganancias para el usuario.

Una actualización sin contratiempos

Una de las noticias más gratificantes para el equipo de Copilot Studio fue la facilidad con la que se llevó a cabo la migración de su aplicación WASM de .NET 8 a .NET 10. A diferencia de las actualizaciones que a menudo implican refactorizaciones complejas o la reescritura de código, este proceso fue predominantemente una cuestión de mantenimiento. La tarea principal consistió en actualizar el target framework en los archivos .csproj y asegurar que todas las dependencias existentes fueran totalmente compatibles con la nueva versión de la plataforma. La sencillez de este proceso subraya la madurez y la estabilidad del ecosistema .NET, facilitando a los desarrolladores la adopción de las últimas innovaciones sin incurrir en costos de migración excesivos. Gracias a esta facilidad, la compilación de Copilot Studio con .NET 10 ya está funcionando con éxito en producción, ofreciendo sus beneficios a los usuarios de inmediato.

Fingerprinting automático: simplificando el despliegue

Entre las características más bienvenidas de .NET 10 para las aplicaciones WebAssembly se encuentra la implementación del fingerprinting automático de los recursos WASM. Esta novedad representa una mejora significativa en el proceso de despliegue y gestión de caché. Anteriormente, las aplicaciones WASM, incluida Copilot Studio, se veían obligadas a implementar soluciones personalizadas para manejar la invalidación de caché y garantizar la integridad de los archivos. Este proceso manual era engorroso y propenso a errores, requiriendo varios pasos:

  • Primero, era necesario leer el manifiesto blazor.boot.json publicado para obtener una lista exhaustiva de todos los recursos.
  • Luego, se ejecutaba un script personalizado, a menudo en PowerShell, para renombrar cada archivo añadiéndole un hash SHA256 único.
  • Finalmente, al solicitar cada recurso desde JavaScript, se debía pasar explícitamente un argumento integrity, lo que añadía una capa de complejidad al cargador de recursos del lado del cliente.

Con .NET 10, todas estas complejidades desaparecen. Los recursos se importan directamente desde dotnet.js, el fingerprinting ahora forma parte intrínseca de los nombres de archivo publicados, y la validación de integridad se realiza de forma automática. Esto permitió al equipo de Copilot Studio eliminar por completo el script de renombrado personalizado y suprimir el argumento integrity de su cargador de recursos. Las lógicas de caché y validación existentes que operaban sobre estos recursos continúan funcionando sin cambios, pero con la ventaja de una gestión de versiones y una seguridad de integridad integrada y automatizada, lo que se traduce en un proceso de despliegue más robusto, sencillo y menos propenso a errores.

Consejo: Si cargas el tiempo de ejecución de .NET WASM dentro de un WebWorker, asegúrate de establecer dotnetSidecar = true al inicializar para garantizar una inicialización correcta en un contexto de trabajador.

Salida AOT más pequeña con WasmStripILAfterAOT

La otra gran novedad de .NET 10 para WebAssembly es que la opción WasmStripILAfterAOT ahora está habilitada por defecto para las compilaciones AOT (Ahead-Of-Time). Esta característica es fundamental para optimizar el tamaño de los paquetes de despliegue. Una vez que los métodos de .NET se compilan a WebAssembly mediante AOT, el Lenguaje Intermedio (IL) original de esos métodos ya no es necesario durante la ejecución en tiempo real. Por lo tanto, .NET 10 elimina este IL del resultado publicado por defecto. Es importante recordar que en .NET 8 esta configuración existía, pero su valor predeterminado era false, lo que significaba que los desarrolladores tenían que habilitarla manualmente para obtener este beneficio.

Copilot Studio emplea una estrategia de empaquetado ligeramente más avanzada para equilibrar el tiempo de inicio y el rendimiento en estado estacionario. Envían un único paquete NPM que contiene tanto un motor JIT (Just-In-Time) para un inicio rápido como un motor AOT para la máxima velocidad de ejecución. Durante el tiempo de ejecución, Copilot Studio carga ambos motores en paralelo: el motor JIT se encarga de las interacciones iniciales para garantizar una respuesta inmediata, y una vez que el motor AOT está listo, el control se transfiere a este para maximizar el rendimiento. Los archivos que son idénticos bit a bit entre ambos modos se deduplican para mantener el tamaño total del paquete lo más reducido posible.

Sin embargo, dado que WasmStripILAfterAOT produce ensamblados AOT que ya no coinciden con sus contrapartes JIT (debido a la eliminación del IL), se reduce el número de archivos que pueden ser compartidos entre los dos motores:

  • En .NET 8, se compartían 59 archivos entre los motores JIT y AOT.
  • En .NET 10, solo se comparten 22 archivos.

El efecto neto en el tamaño del paquete de Copilot Studio es un aumento de aproximadamente el 15%. Aunque este incremento podría parecer significativo, en la práctica, el impacto en los usuarios finales es mínimo. Esto se debe a que el motor JIT sigue siendo la primera parte que descargan y ejecutan, lo que asegura que la interactividad inicial de la aplicación no se vea afectada. La descarga del paquete AOT es aproximadamente un 6% más lenta (~200 ms) en una conexión LAN rápida y alrededor de un 17% más lenta (~5 s) en una conexión 4G, pero todo esto ocurre en segundo plano, después de que la aplicación ya es totalmente responsiva para el usuario. Esto significa que la experiencia percibida por el usuario no se degrada en términos de tiempo de carga inicial.

A pesar del ligero aumento en el tamaño del paquete para la porción AOT, los beneficios en tiempo de ejecución superan claramente el coste de empaquetado para las cargas de trabajo de Copilot Studio:

  • Ejecución aproximadamente un 20% más rápida en la primera llamada (ruta fría).
  • Ejecución aproximadamente un 5% más rápida en llamadas posteriores (ruta cálida).

Estos aumentos de rendimiento son particularmente notables en agentes grandes y complejos, los escenarios de «bots grandes» donde el código compilado AOT realiza el trabajo pesado. La capacidad de procesar tareas complejas más rápidamente se traduce directamente en una experiencia de usuario más fluida y eficiente, especialmente en aplicaciones que dependen de una lógica de negocio intensiva ejecutada en el cliente.

Prueba .NET 10 para tus aplicaciones WebAssembly

Si actualmente estás ejecutando una aplicación Blazor o .NET WebAssembly en .NET 8, la actualización a .NET 10 es una inversión que vale la pena considerar. Los pasos para migrar son sencillos y los beneficios son sustanciales:

  • Actualiza el <TargetFramework> de tu proyecto a net10.0 y actualiza las referencias de tus paquetes Microsoft.AspNetCore.*, Microsoft.Extensions.*, y System.*.
  • Elimina cualquier lógica personalizada de renombrado de activos o de integración de integrity, ya que el fingerprinting ahora está integrado automáticamente en la plataforma.
  • Si utilizas la compilación AOT, te beneficiarás automáticamente del nuevo valor predeterminado de WasmStripILAfterAOT, lo que contribuirá a reducir el tamaño de tus paquetes.

Para aquellos que necesiten ayuda para llevar sus aplicaciones a la última versión de .NET, herramientas como GitHub Copilot app modernization for .NET pueden ser de gran utilidad. Esta herramienta puede analizar tu solución, planificar la actualización y aplicar los cambios necesarios de forma automatizada, simplificando aún más el proceso de migración. Puedes obtener más información sobre cómo modernizar tus aplicaciones .NET en dotnet.microsoft.com/platform/modernize.

La exitosa actualización de Copilot Studio es un ejemplo más de cómo cada nueva versión de .NET sigue haciendo de WebAssembly una plataforma más rápida, más pequeña y más sencilla de implementar. La dedicación a la mejora continua por parte del equipo de .NET y el ecosistema en general asegura que los desarrolladores puedan seguir construyendo aplicaciones web de alto rendimiento con C#.

Un agradecimiento especial a Denis Voituron del equipo de Copilot Studio por compartir los detalles de la migración y los datos de rendimiento que hicieron posible esta publicación.

Author: Enagora

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *