NativeAOT is much slower that JIT version
See original GitHub issueA simple REST server as below, shows that NativeAOT is much slower than JIT version of the code.
Here is the the only controller in the app :
using Microsoft.AspNetCore.Mvc;
namespace nativeAOTapi.Controllers;
[Controller]
[Route("api/[controller]")]
public class TimeAPI :Controller
{
[HttpGet]
[Route("time")]
public ActionResult<long> GetTime()
{
return DateTimeOffset.Now.ToUnixTimeMilliseconds();
}
}
Here is Program.cs:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
app.UseSwagger();
app.UseSwaggerUI();
app.MapControllers();
app.Run();
Here is Program.csproj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<IlcOptimizationPreference>Speed</IlcOptimizationPreference>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.DotNet.ILCompiler" Version="7.0.0-*" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
</ItemGroup>
</Project>
Here is Nuget.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<packageSources>
<!--To inherit the global NuGet package sources remove the <clear/> line below -->
<clear />
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
<add key="dotnet-experimental" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-experimental/nuget/v3/index.json" />
<add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" />
</packageSources>
</configuration>
JIT version runs on port 5247
NativeAOT version runs on port 5000
Here is some benchmark results;
for JIT:
Bombarding http://localhost:5247/api/TimeAPI/time for 10s using 200 connection(s)
[========================================================================================================================================================================================] 10s
Done!
Statistics Avg Stdev Max
Reqs/sec 175618.11 38073.63 219971.12
Latency 1.14ms 2.07ms 192.43ms
HTTP codes:
1xx - 0, 2xx - 1749150, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 41.53MB/s
for NativeAOT
Bombarding http://localhost:5000/api/TimeAPI/time for 10s using 200 connection(s)
[========================================================================================================================================================================================] 10s
Done!
Statistics Avg Stdev Max
Reqs/sec 51621.50 7439.70 60899.66
Latency 3.89ms 2.25ms 148.00ms
HTTP codes:
1xx - 0, 2xx - 514153, 3xx - 0, 4xx - 0, 5xx - 0
others - 0
Throughput: 12.21MB/s
JIT version is build and run with dotnet run
NativeAOT version is build with dotnet publish -r linux-x64 -c Release
dotnet : 6.0.101
OS : Linux pop-os 5.15.11-76051511-generic #202112220937~1640185481~21.10~b3a2c21 SMP Wed Dec 22 15:41:49 U x86_64 x86_64 x86_64 GNU/Linux
CPU : Intel Core i7 8700
Issue Analytics
- State:
- Created 2 years ago
- Comments:19 (18 by maintainers)
Top Results From Across the Web
AOT vs JIT in .NET : r/dotnet
JIT compiled Java and C# code can, sometimes, be as fast as native C++, thanks to runtime optimization, but AFAIK it is rarely...
Read more >Native AOT deployment overview - .NET
Native AOT apps don't use a just-in-time (JIT) compiler when the application runs. Native AOT apps can run in restricted environments where a ......
Read more >Native AOT and Ahead-of-Time Compilation in .NET
As we can see on my PC, Native AOT shows quicker execution time on Windows and is more than ten times smaller compared...
Read more >NET 7 introduces Native AOT
Native AOT is a great concept, I was hoping to use it to build VSTs and ... this is a myth, AOT is...
Read more >the native aot is just fast the startup right? - Microsoft Q&A
It will speed up application startup, but it will take a significant amount of disk space and build time will be slower than...
Read more >Top Related Medium Post
No results found
Top Related StackOverflow Question
No results found
Troubleshoot Live Code
Lightrun enables developers to add logs, metrics and snapshots to live code - no restarts or redeploys required.
Start FreeTop Related Reddit Thread
No results found
Top Related Hackernoon Post
No results found
Top Related Tweet
No results found
Top Related Dev.to Post
No results found
Top Related Hashnode Post
No results found
Top GitHub Comments
The code generation options are all have different tradeoffs:
Right now I’m thinking about a combination of generics and source generation to balance versioning (how much code exists in the app vs framework), but the generic constraints problem is a hard one to solve.
@jkoritzinsky Yep we should put this under a microscope. I have some ideas where the time is spent but it would be good to get some confirmation.