0

.Net 7 Preview 3

.Net no para de tener novedades y nuevas versiones. Entramos en un nuevo ciclo la versión 7 y antes de su lanzamiento oficial, noviembre de este año, podemos ir viendo todas las mejoras. Hace unos días ya se encuentra publicada la versión preview 3. Las mejoras más destacables están relacionadas con observabilidad, tiempos de inicio, codegen, mejoras en el garbage collector, compilación nativa de AOT y otras más.

Podemos descargar la versión desde este link para los sistemas operativos Windows, MacOS y linux solo debes hacer clic aqui.

Podemos probar en las cadenas de prueba de Visual Studio con la versión 17.2 preview 3. Lamentablemente, Visual Studio para Mac todavía no se encuentra disponible.

‎Aplicaciones más rápidas y ligeras con AOT nativo‎

En la versión anterior de .NET 7 Preview 2‎‎, se anunció que el proyecto AOT nativo se ha ya no se encuentra en estado experimental y se ha trasladado al desarrollo de core principal en .NET 7 en el repositorio dotnet/runtime. 

‎Si deseas saber más sobre Native AOT pudes consultar la documentación haciendo clic en el enlace. clic aquí. Pero veremos un poco de que se trata.

‎¿Qué es la AOT nativa?‎

Ahead-of-time (AOT), compilación anticipada, hace referencia a un conjunto de tecnologías que generan código en tiempo de compilación en lugar de tiempo de ejecución. AOT no es nuevo, existe en varios entornos, y ahora, estará disponible en versiones de cliente-servidor, Mono AOT para dispositivos móviles y WASM. Debemos tener en cuenta que no reemplaza las tecnologías existentes si no busca aumentar las capacidades de .Net.

‎La principal ventaja de Native AOT es el tiempo de inicio, el uso de memoria, el acceso a plataformas restringidas (no se permite JIT) y el tamaño más pequeño en el disco. Las aplicaciones comienzan a ejecutarse en el momento en que el sistema operativo se aloja en ellas en la memoria. Las estructuras de datos están optimizadas para ejecutar código generado por AOT, no para compilar código nuevo en tiempo de ejecución. Esto es similar a cómo se compilan lenguajes como Go, Swift y Rust. Native AOT es más adecuado para entornos donde el tiempo de inicio es más importante. Targeting Native AOT tiene requisitos más estrictos que las aplicaciones y bibliotecas generales de .NET Core/5+. La AOT nativa prohíbe emitir nuevo código en tiempo de ejecución (por ejemplo, Reflection.Emit) y cargar nuevos ensamblados .NET en tiempo de ejecución (por ejemplo, modelos de plug-in).‎

Crossgen en el más beneficiado con Native AOT porque es un proceso de corta duración y la sobrecarga de inicio domina el tiempo de ejecución general:‎

En próximas versiones veremos más novedades sobre este tema.

Observabilidad

Sigue evolucionando la compatibilidad con la especificación OpenTelemetry nativa de la nube. Se agregó compatibilidad con las actualizaciones específicas ‎‎#988‎‎ y ‎‎#1708‎‎ que hacen que el estado de seguimiento sea mutable para los muestreadores.‎

 //  ActivityListener Sampling callback
    listener.Sample = (ref ActivityCreationOptions<ActivityContext> activityOptions) =>
    {
        activityOptions = activityOptions with { TraceState = "rojo=00f067aa0ba902b7" };
        return ActivitySamplingResult.AllDataAndRecorded;
    };

System.Composition.Hosting

Managed Extensibility Framework recibe una actualización para alinearse con las API de la versión anterior. Las nuevas API permiten agregar una única instancia de objeto al ‎‎contenedor System.Composition.Hosting‎‎. Similar a la funcionalidad proporcionada en las interfaces ‎‎heredadas System.ComponentModel.Composition.Hosting‎‎ con la API ‎‎ComposeExportedValue(CompositionContainer, T)‎.

namespace System.Composition.Hosting
{
    public class ContainerConfiguration
    {
        public ContainerConfiguration WithExport<TExport>(TExport exportedInstance);
        public ContainerConfiguration WithExport<TExport>(TExport exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);

        public ContainerConfiguration WithExport(Type contractType, object exportedInstance);
        public ContainerConfiguration WithExport(Type contractType, object exportedInstance, string contractName = null, IDictionary<string, object> metadata = null);
    }
}

‎Mejoras en el tiempo de inicio con Write-Xor-Execute habilitado‎

Como en versiones anteriores, el rendimiento es un tema importante para .NET 7. Se  implementó los stubs de precodificación y conteo de llamadas (stubs auxiliares de compilación en niveles) para reducir significativamente el número de modificaciones posteriores a la creación del código ejecutable en el tiempo de ejecución. Esto resultó en mejoras del tiempo de inicio del 10-15%.‎

Otro beneficio, este cambio también resultó en mejoras de rendimiento de estado estacionario (hasta un 8%) en algunos microbenchmarks y algunos ASPNet Benchmarks incluso sin Write-Xor-Execute habilitado.‎

CodeGen

Como no podía ser menos, la comunidad se encuentra muy activa y ha estado aportando una gran cantidad de optimizaciones y corrección de errores la cual el equipo no quiere dejar de nombrar. Aquí puede ver la lista con los links con correspondientes:

From @clamp03

From @SkiFoD

From @sandreenko

From @SingleAccretion

From @trympet

From @Wraith2

Dynamic PGO

Arm64

Loop Optimizations

  • Loop Cloning improved the duration of single invocation by 21% for System.Collections.Tests.Perf_BitArray.BitArrayLeftShift(Size: 512): image

General Optimizations

Regiones de GC habilitadas de forma predeterminada‎

La funcionalidad de regiones que nos ayudará con la utilización de la memoria para aplicaciones de alto rendimiento y ahora se encuentra habilitada de forma predeterminada en todas las plataformas, excepto MacOS y NativeAOT ( se habilitarán en el futuro). 

‎Criptografía: Generar nombres X.500 de forma más robusta‎

Se simplifica el trabajo con certificados al introducir una clase que proporciona más claridad para analizar nombres X.500.‎

Cualquiera que quisiera crear un nombre X.500 (como para crear certificados de prueba con la clase ‎CertificateRequest lo hacía con la manipulación de cadenas, ya sea a través de un simple literal o con formato de cadena, por ejemplo.

request = new CertificateRequest($"CN={subjectName},OU=Test,O=""Fabrikam, Inc.""", ...);

Todo irá bien, excepto cuando tienen una coma, cita o cualquier cosa que pueda modificar el analizador. Se agregó la clase  X500DistinguishedNameBuilder. Vean el código de ejemplo:

X500DistinguishedNameBuilder nameBuilder = new();
nameBuilder.AddCommonName(subjectName);
nameBuilder.AddOrganizationalUnitName("Test");
nameBuilder.AddOrganizationName("Fabrikam, Inc.");

request = new CertificateRequest(nameBuilder.Build(), ...);

Conclusiones

Por el momento no parece haber grandes cambios. Podemos consultar en la documentación los breaking changes para estar preparado en la actualización de nuestras aplicaciones. Esta es solamente la Preview 3, nos quedan muchas por delante, y seguramente, muchísimos más cambios y novedades.

Fernando Sonego

Deja una respuesta

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