Microsoft presenta en una publicación del .NET Blog fechada el 15 de septiembre de 2026 cientos de mejoras que llegaron a .NET 11, y las describe como el resultado acumulativo de un trabajo que abarca el compilador en tiempo de ejecución JIT, el entorno de ejecución y las bibliotecas. La idea principal no es que exista una función individual que multiplique el rendimiento, sino eliminar pequeñas ganancias recurrentes: una comprobación de límites que ya no es necesaria, una asignación de memoria eliminada, un bloqueo o una llamada al sistema evitados y bucles que ahora se ejecutan con menos ciclos del procesador.
La importancia de este tipo de mejoras es que gran parte de ellas no requiere modificar el código de las aplicaciones ni rediseñarlas. El compilador JIT convierte el código intermedio IL, que normalmente producen C#, F# y Visual Basic, en instrucciones nativas que ejecuta el procesador. Cuando consigue demostrar que una llamada virtual puede dirigirse a un tipo concreto o que una determinada comprobación no fallará, puede generar instrucciones más cortas y mejorar las posibilidades de integrar unas funciones dentro de otras.
Mejora de la eliminación de abstracciones
Una parte destacada del material se centra en lo que Microsoft denomina eliminación de abstracciones, es decir, permitir que el entorno de ejecución supere el coste de ejecución de algunas abstracciones que el desarrollador necesita en el diseño del programa. Algunos ejemplos son las llamadas a interfaces y a métodos virtuales, en las que la ejecución tradicional puede tener que cargar varios punteros y realizar una llamada indirecta, lo que impide integrar la función llamada en la función actual.
.NET 11 sigue desarrollando el enfoque de «desvirtualización protegida» o Guarded Devirtualization. JIT identifica el tipo más común durante la ejecución, crea una ruta rápida para llamarlo directamente y mantiene la ruta virtual para garantizar la corrección de la ejecución si más adelante aparece otro tipo. Cuando esto permite integrar la función, se hacen posibles otras optimizaciones, como la propagación de constantes, la eliminación de ramas y las comprobaciones de límites.
El trabajo se extiende a los métodos virtuales genéricos, las operaciones ReadyToRun y NativeAOT y las implementaciones predeterminadas de interfaces. El material señala que estas mejoras pueden aumentar el tamaño del código cuando las llamadas directas provocan una mayor integración, pero hacen que la lógica del programa sea más visible para el optimizador.
Menos asignaciones y menor impacto en el recolector de basura
.NET 11 también continúa ampliando el análisis de escape (Escape Analysis), que intenta determinar si un objeto creado dentro de una función sale de su ámbito. Si se demuestra que no abandona dicho ámbito, JIT puede evitar colocarlo en el montón administrado o eliminar por completo la asignación en algunos casos, lo que reduce la presión sobre el recolector de basura.
La fuente muestra ejemplos de mejoras en el boxing de valores anulables (Nullable boxing) y en el análisis condicional de escape en la enumeración de colecciones. En una de las mediciones, desapareció una asignación de 32 bytes al enumerar una colección construida a partir de un campo de instancia, y el tiempo de ejecución descendió de 13.874 nanosegundos en .NET 10 a 2.674 nanosegundos en .NET 11. Algunos casos que utilizan valores genéricos o llamadas a interfaces también pueden evitar asignaciones temporales de 24 bytes.
Estas cifras corresponden a operaciones muy pequeñas, por lo que no deben interpretarse como un aumento general y constante del rendimiento de todas las aplicaciones. Su principal utilidad es revelar patrones de código que el entorno de ejecución puede optimizar, mientras que el efecto real dependerá de la naturaleza de la aplicación y de sus rutas críticas.
Delegados y entorno de ejecución asíncrono
.NET 11 incluye cambios en la representación de los delegados en CoreCLR, entre ellos la eliminación de un campo del tamaño de un puntero de cada objeto delegado en un proceso de 64 bits, lo que supone un ahorro de 8 bytes por delegado según el material. También se reorganizaron los campos de la representación de los delegados en NativeAOT y se colocaron algunos valores que se utilizan conjuntamente en la memoria para mejorar el acceso a ellos en arquitecturas como Arm64.
La publicación también presenta una nueva estructura bajo el nombre «runtime async», que traslada parte de la responsabilidad de transformar los métodos async/await del compilador de C# a JIT y al entorno de ejecución. En el modelo tradicional, el compilador crea una máquina de estados que contiene los campos necesarios para la reanudación, como los parámetros, las variables locales, los objetos esperados y el estado de ejecución. El nuevo modelo se basa en un contrato más pequeño en IL y deja después en manos del entorno de ejecución y de JIT decisiones relacionadas con lo que permanece vivo en los puntos de suspensión, cómo se organizan los objetos de continuación y la creación de Task o ValueTask visibles externamente.
¿Qué cambia en la práctica?
El significado editorial de esta ronda es que .NET 11 apuesta por mejorar el código existente tanto como por añadir nuevas interfaces de programación. Las aplicaciones que dependen mucho de interfaces, métodos genéricos, delegados, enumeración y operaciones asíncronas pueden beneficiarse sin cambios directos en el código fuente, pero la magnitud de la mejora variará según el procesador, el sistema operativo, la configuración del entorno de ejecución y la naturaleza de la carga.
Microsoft recomienda probar los resultados con BenchmarkDotNet, fijando .NET 10 y .NET 11 y ejecutando el mismo código en ambas versiones. También advierte que las mediciones publicadas son pruebas muy precisas y pueden verse afectadas por el hardware, otros procesos y la configuración del entorno. Por ello, los resultados de una prueba pequeña no bastan para tomar una decisión de actualización ni para demostrar una mejora general; es necesario medir las cargas reales de la aplicación antes de adoptar conclusiones más amplias.