loading experience

.NET

Performance in .NET 10: what improves in the runtime

Stack allocation, devirtualisation and optimised loops: why the same code runs faster without changes.

Performance in .NET 10: what improves in the runtime

Every .NET release brings "free" performance improvements: you update the target framework and existing code becomes faster. .NET 10 is no exception.

Each step reduces allocations or indirect calls in existing code.
Each step reduces allocations or indirect calls in existing code.

Fewer heap allocations

The JIT is better at analysing whether an object "escapes" the method that creates it. When a small object, a fixed-size array or a delegate stays local, the JIT can allocate it on the stack instead of the heap: less work for the garbage collector and fewer pauses.

More direct calls

Devirtualisation turns calls through interfaces into direct calls when the concrete type is known, opening the way to inlining. In .NET 10 this also applies to many array interface methods, which are heavily used in foreach loops over collections.

Loops and modern instructions

The compiler reorganises loops better, removes redundant bounds checks and takes advantage of the vector instructions of recent CPUs, including AVX10 extensions on x64 and SVE instructions on Arm64.

How to check it on your code

Do not trust feelings: measure. A repeatable benchmark before and after the upgrade tells you exactly how much you gain.

[MemoryDiagnoser]
public class SumBenchmark
{
    private readonly int[] _data = Enumerable.Range(0, 10_000).ToArray();

    [Benchmark]
    public int Sum()
    {
        var total = 0;
        foreach (var n in _data) total += n;
        return total;
    }
}

Run the same benchmark with net8.0 and net10.0 as targets and compare times and allocations: it is the most honest way to decide whether, and how much, migrating pays off.

Comments (0)

No comments yet.

Leave a comment