DEV Community

Cover image for Native AOT in .NET 10: Everything for C# Developers
chandana pushpakumara
chandana pushpakumara

Posted on

Native AOT in .NET 10: Everything for C# Developers

Honestly, C# has had an incredible run over the last twenty years. It’s easily one of the most balanced languages out there, but I think people often forget how much of that heavy lifting is actually done by the JIT compiler. The way it optimizes everything on the fly at runtime is really what gives it that performance edge.

But in 2026, Microsoft introduced Native AOT in .NET 10. The performance floor has shifted. Now that .NET 10 has fully leaned into Native AOT, the trade-offs have changed. In a world of real-time AI and massive container clusters, 'fast enough' doesn't cut it. We need that immediate execution and smaller footprint to stay competitive, especially when you're scaling a thousand instances where every megabyte of overhead adds up.

This is where Native AOT (Ahead-of-Time compilation) in .NET 10 becomes a game changer.

Traditional Model (JIT)

  • Code compiled to Intermediate Language (IL)
  • JIT compiles IL → machine code at runtime
  • Pros: Flexibility, dynamic optimizations
  • Cons: Startup delay, higher memory usage

Native AOT Model

  • Code compiled directly into machine code during publish
  • No JIT compilation required at runtime
  • Pros: Instant startup, smaller footprint, improved security

Project: Native AOT vs JIT Performance Benchmark

🧱 Solution Structure
AOTPerformanceDemo/
├── JitApp/ (Standard .NET Console App)
├── AotApp/ (Native AOT Console App)
└── BenchmarkRunner/ (Measures performance)

Create the Solution

dotnet new sln -n AOTPerformanceDemo
dotnet new console -n JitApp
dotnet new console -n AotApp
dotnet new console -n BenchmarkRunner
dotnet sln add JitApp
dotnet sln add AotApp
dotnet sln add BenchmarkRunner
Enter fullscreen mode Exit fullscreen mode

Add Sample Workload (Same Code in Both Apps)
Replace Program.cs in JitApp and AotApp:

using System.Diagnostics;

Console.WriteLine("App starting...");
var sw = Stopwatch.StartNew();
var result = HeavyComputation();

sw.Stop();
Console.WriteLine($"Result: {result}");
Console.WriteLine($"Execution Time: {sw.ElapsedMilliseconds} ms");

static long HeavyComputation()
{
    long sum = 0;    for (int i = 0; i < 10_000_000; i++)
    {
        sum += i;
    }    return sum;
}
Enter fullscreen mode Exit fullscreen mode

Enable Native AOT (Only for AotApp)
Edit AotApp.csproj:

<Project Sdk="Microsoft.NET.Sdk">  
<PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net10.0</TargetFramework>

    <!-- Enable Native AOT -->
    <PublishAot>true</PublishAot>    
    <!-- Reduce size -->
    <PublishTrimmed>true</PublishTrimmed>
    <InvariantGlobalization>true</InvariantGlobalization>
  </PropertyGroup>
</Project>
Enter fullscreen mode Exit fullscreen mode

Build JIT App

dotnet build JitApp -c Release
Enter fullscreen mode Exit fullscreen mode

Publish Native AOT App

dotnet publish AotApp -c Release -r win-x64
Enter fullscreen mode Exit fullscreen mode

Benchmark Runner

using System.Diagnostics;

RunTest("JIT App", @"..\JitApp\bin\Release\net10.0\JitApp.exe");
RunTest("Native AOT App", @"..\AotApp\bin\Release\net10.0\win-x64\publish\AotApp.exe"); 

static void RunTest(string name, string path)
{
    Console.WriteLine($"\nRunning {name}..."); 
    var sw = Stopwatch.StartNew(); 

    var process = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = path,
            RedirectStandardOutput = true,
            UseShellExecute = false
        }
    }; 

    process.Start();
    process.WaitForExit(); 
    sw.Stop(); 

    Console.WriteLine($"{name} Total Time (including startup): {sw.ElapsedMilliseconds} ms");
}
Enter fullscreen mode Exit fullscreen mode

Run Benchmark

dotnet run --project BenchmarkRunner -c Release
Enter fullscreen mode Exit fullscreen mode

Find the complete implementation and benchmarking project on GitHub

Result

Based on the results shown in my terminal, here is a visual comparison of the performance gap between the standard JIT approach and the new Native AOT in .NET 10.

The data reflects the following metrics from my run:

  • JIT App (Standard): 170 ms total execution time.
  • Native AOT App: 69 ms total execution time.

This represents a ~60% reduction in startup and execution time for the Native AOT version.
If you interesting you can read my full article

Top comments (0)