A partir de .NET 11, el framework ya no se ejecutará en hardware antiguo que carezca de conjuntos de instrucciones modernos, como aquellos que requieren la base x86-64-v1. Este cambio traslada el requisito mínimo a x86-64-v2 en todos los sistemas operativos, un cambio diseñado para alinearse con los requisitos de hardware de sistemas operativos modernos como Windows 11 y para reducir la complejidad de dar soporte a procesadores heredados.
Modernización de los requisitos de hardware
El runtime de .NET 11 actualiza sus requisitos mínimos de hardware para favorecer conjuntos de instrucciones modernos en arquitecturas x86/x64 y Arm64. Para los sistemas x86/x64, la base se mueve de v1 a v2, lo que garantiza el soporte para conjuntos de instrucciones como CX16, POPCNT, SSE3, SSSE3, SSE4.1 y SSE4.2.

Esta imagen ilustra los cambios específicos en la base de hardware y los requisitos de conjuntos de instrucciones descritos en la sección de modernización de hardware.
Gráfico elaborado por HN Digest a partir de cifras de learn.microsoft.com; los valores se muestran como aparecen en la fuente.
En las arquitecturas Arm64, la actualización introduce un nuevo requisito para el conjunto de instrucciones LSE (Large System Extensions) en Windows y Linux. Específicamente para Windows, el objetivo ReadyToRun (R2R) se ha actualizado a armv8.2-a + RCPC, cubriendo la mayoría del hardware soportado oficialmente por el sistema operativo.
“La actualización de la base mínima se realizó para reducir la complejidad del mantenimiento del código base y para alinearse mejor con los requisitos de hardware documentados (y a menudo impuestos) del sistema operativo subyacente.”
— What's new in .NET 11 runtime
Transición a Async nativo del Runtime
Un cambio arquitectónico significativo en .NET 11 es la introducción de 'Runtime Async V2'. Esta característica se aleja del modelo tradicional donde el compilador emite clases de máquinas de estado para manejar tareas asíncronas. En su lugar, el propio runtime ahora rastrea la ejecución, suspensión y reanudación asíncrona.

Esta captura de pantalla proporciona un ejemplo concreto de la característica 'Runtime Async V2' que reemplaza las máquinas de estado generadas por el compilador.
Este cambio produce trazas de pila más limpias porque los métodos reales aparecen directamente en la pila de llamadas durante la ejecución en vivo. También mejora la depurabilidad al permitir que los depuradores avancen a través de los límites de await sin saltar a la infraestructura generada por el compilador. Las propias bibliotecas del runtime ahora se compilan con esta característica habilitada, lo que permite una migración más fluida de aplicaciones completas.
Ganancias en rendimiento y optimización
El nuevo modelo Runtime Async incluye varias optimizaciones de rendimiento, como versiones dedicadas compiladas por JIT de métodos síncronos que devuelven tareas. El JIT también combina de forma eficiente los puntos de suspensión asíncronos para reducir el tamaño del código y almacena en caché las continuaciones para reducir la presión de asignación en código con mucha carga asíncrona.
Además, el runtime ahora detecta cuando una continuación no tiene nada que restaurar y omite el ciclo de captura/restauración para ExecutionContext. Esto reduce la sobrecarga en rutas de alto rendimiento, particularmente para aplicaciones que utilizan valores AsyncLocal de forma moderada y llaman a ConfigureAwait(false).
Compensaciones de mantenimiento y compatibilidad
Microsoft afirma que el cambio a una base de hardware más alta reduce la complejidad del código base al eliminar el soporte para hardware antiguo que es poco probable que se utilice. Esto también ayuda a definir un 'denominador común más bajo' para los objetivos AOT, lo que puede mejorar el rendimiento al evitar la necesidad de recurrir a los conjuntos de instrucciones más antiguos posibles.
Sin embargo, este cambio significa que las aplicaciones dirigidas a .NET 11 fallarán al ejecutarse en CPUs más antiguas, pudiendo imprimir un mensaje indicando que la CPU carece de los conjuntos de instrucciones de la base. Para los ensamblados capaces de ReadyToRun, algunos dispositivos compatibles que no cumplan con el nuevo soporte esperado pueden experimentar una sobrecarga adicional de inicio.
Qué dicen los lectores de Hacker News
- Nota técnica: Un comentarista señaló un cambio específico en cómo se manejan los decimales, notando que un valor de 0.1 resulta en una representación diferente en .NET 11 en comparación con .NET 10. comentario ↗
- Nota técnica: Un usuario expresó sorpresa por el soporte de runtime async, señalando que aunque esperaba trazas de pila mejoradas, le impresionó que el cambio pudiera mantener un rendimiento equivalente. comentario ↗
- Nota técnica: Un comentarista planteó una pregunta abierta sobre la implementación subyacente de runtime async, preguntando si implica el uso de corrutinas con pila (stackful coroutines). comentario ↗
- Nota técnica: Un comentarista aclaró que .NET 11 es un lanzamiento de Soporte de Término Estándar, señalando que en realidad tiene una ventana de soporte más corta que .NET 10. comentario ↗
Resumen de opiniones del hilo de Hacker News; no son hechos verificados. Leer el debate completo ↗