.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
- Fix missing zero-offset sequences and add checking
- Handle direct addresses for statics in IsFieldAddr
- Do not number partial definitions and ARGPLACE nodes
- Use SSA def descriptors in copy propagation
- ZeroObj assertions
- Deduplicate some HWI codegen code
- Use push for 8/12 byte struct args on x86
- Do not set GLOB_REF for invariant indirections
- Do not value number locals on the LHS
- Keep the volatility of CLS_VARs in rationalization
- Slightly more aggressive ASG reversal
- Fix copy propagation
- Count OBJ/BLK as memory uses
- Delete compUnsafeCastUsed
- Fix a couple issues with GTF_GLOB_REF setting
- Do not create small constants while morphing cascading addition
- Do not propagate RHS flags in block morphing
- Stop generating CLS_VAR for 64 bit targets
- A better fix for #66242
- Do not assume containment
- Some small copy propagation changes
From @trympet
From @Wraith2
Dynamic PGO
Arm64
- Morph Vector.Create(0) to Vector.Zero
- Allow constant propagation of Vector.Zero.
- Optimize Arm64 comparison instructions: cmle, cmlt, fcmle, fcmlt
- Better addressing mode for floating point on arm64
- Optimize a % b
- JIT: Faster vector == Vector128.Zero on arm64
Loop Optimizations
- Loop Cloning improved the duration of single invocation by 21% for System.Collections.Tests.Perf_BitArray.BitArrayLeftShift(Size: 512):
General Optimizations
- Eliminate extra copy of struct from a callee that was returned in Hidden Buffer
- Unroll String.Equals and str.StartsWith for constant strings
- Extend Equals/StartsWith auto-vectorization for OrdinalIgnoreCase
- movzx optimization after setcc shows 0.03 ~ 0.16 % code size reduction
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.