.NET 8 ve Native AOT: Performans ve Verimlilikte Yeni Bir Adım

Erkan Güzelküçük
4 min readOct 6, 2023

--

.NET 8, yazılım geliştirme dünyasında önemli bir adım atmış durumda. Özellikle performans, bellek kullanımı ve başlatma süreleri gibi faktörler üzerine odaklanan .NET native ahead-of-time (AOT) derlemesini desteklemek için bazı yenilikler getirilmiştir. Bu yazıda, .NET 8'in native AOT desteğini inceleyecek ve bu yeni yaklaşımın yazılım uygulamalarına nasıl olumlu etkiler sağladığını ve CreateSlimBuilder, CreateEmptyBuilder yapılarını ele alacağız.

Photo by Stéfano Girardelli on Unsplash

.NET Native AOT Nedir?

.NET geliştirme ekosistemi içinde, genellikle bir programın kaynak kodu derlendikten sonra “Intermediate Language” olarak adlandırılan bayt kodu üretilir. Bu IL kodu, uygulama kullanıcısı tarafından çalıştırılmadan önce bir Just-In-Time (JIT) derleyici tarafından işlenir. Bu, uygulamanın başlatılma süresini etkileyebilir, özellikle büyük ve karmaşık uygulamalarda daha uzun başlatma süreleri ve yüksek bellek kullanımına neden olabilir.

.NET 8 ile gelen native AOT, bu sorunları ele almak için tasarlanmış bir yaklaşımdır. AOT derlemesi, uygulama kodunun çalışma zamanında derleme yerine derleme zamanında derlenmesini sağlar. Bu, uygulamanın başlatılma süresini önemli ölçüde hızlandırabilir, çünkü IL kodunu çalıştırmak yerine derlenmiş makine kodunu doğrudan kullanabilirsiniz. Native AOT, özellikle performans ve verimlilik odaklı uygulamalarda önemlidir ve özellikle mobil ve gömülü sistemler için büyük bir avantaj sunar.

.NET Native AOT Destekli Uygulamalar

.NET 8 ile birlikte, native AOT derlemesini destekleyen uygulamalar için yeni bir şablon sunulmuştur. Bu şablonlar, AOT kullanarak yayınlanan uygulamaların daha küçük boyutlu, daha az bellek kullanımı ve daha hızlı başlatma süreleri gibi önemli performans iyileştirmeleri sağladığını gösteriyor. Native AOT şu anda gRPC, minimal API ve worker service uygulamaları tarafından desteklenmektedir.

ASP.NET Core ve native AOT uyumluluğuyla ilgili bilinen sorunları görmek için GitHub sorunu dotnet/core #8288'ı inceleyebilirsiniz.

CreateSlimBuilder Yöntemi

CreateSlimBuilder yöntemi, ASP.NET Core uygulamalarını başlatmak için kullanılan bir yöntemdir. Ancak, bu yöntem CreateBuilder yönteminden farklı olarak, uygulamanın çalışması için gereken minimum ASP.NET Core özelliklerini içerir. CreateSlimBuilder yöntemi, AOT (Ahead of Time) derlemesi ve uygulama başlatma sürelerini optimize etmek isteyen geliştiriciler için özellikle faydalıdır.

  • appsettings.json ve appsettings.{EnvironmentName}.json için JSON Configuration.
  • User Secret Configuration.
  • Consol Logging.
  • Logging Configuration
using System.Text.Json.Serialization;
using MyFirstAotWebApi;

var builder = WebApplication.CreateSlimBuilder(args);
builder.Logging.AddConsole();

builder.Services.ConfigureHttpJsonOptions(options =>
{
options.SerializerOptions.TypeInfoResolverChain.Insert(0, AppJsonSerializerContext.Default);
});

var app = builder.Build();

var sampleTodos = TodoGenerator.GenerateTodos().ToArray();

var todosApi = app.MapGroup("/todos");
todosApi.MapGet("/", () => sampleTodos);
todosApi.MapGet("/{id}", (int id) =>
sampleTodos.FirstOrDefault(a => a.Id == id) is { } todo
? Results.Ok(todo)
: Results.NotFound());

app.Run();

[JsonSerializable(typeof(Todo[]))]
internal partial class AppJsonSerializerContext : JsonSerializerContext
{

}

Bu örnek, CreateSlimBuilder yönteminin nasıl kullanılacağını ve uygulama başlatma süreçlerini optimize etmek için nasıl yapılandırılacağını göstermektedir. CreateSlimBuilder yöntemi, uygulamaların gereksinimlerine göre özelleştirilebilir ve sadece temel özellikleri içerir.

CreateSlimBuilder Yönteminin Avantajları

CreateSlimBuilder yöntemi, ASP.NET Core uygulamalarının daha küçük boyutta, daha az bellek kullanımıyla ve daha hızlı başlatma süreleriyle yayınlanmasını sağlar. Bu, uygulamanın performansını artırırken kaynakların daha verimli kullanılmasını sağlar. Ayrıca, AOT derlemesi için gerekli minimum özelliklere sahip olduğundan, uygulamaları hızlı bir şekilde başlatmak isteyen geliştiriciler için idealdir.

Source Generators Nedir?

Source Generators, .NET 8'in bir parçası olarak tanıtılan bir derleme zamanı özelliğidir. Bu özellik, yazılım geliştiricilerine kodlarını daha etkili ve optimize edilmiş hale getirme fırsatı sunar. Kaynak üreteçleri, belirli görevleri otomatikleştirmek ve kod yazmayı daha verimli hale getirmek için kullanılır.

Source Generators ve Native AOT Uygulamaları

.NET 8 ile birlikte tanıtılan “Native AOT” derlemesi, uygulamaların daha hızlı başlatılmasını, daha küçük boyutta olmasını ve daha az bellek tüketmesini sağlar. Ancak, bu derleme türü kullanıldığında, kullanılmayan kodlar yayımlama sırasında kesilir ve uygulama çalışma zamanında sınırsız yansıma (reflection) kullanamaz.

İşte burada “Source Generators” devreye girer. Kaynak üreteçleri, Reflection gereksinimini ortadan kaldırmak için kullanılır. Bazı durumlarda, Source Generators, bir Generator gerekmese bile AOT için optimize edilmiş kod üretir.

Oluşturulan kodları incelemek için bir uygulamanın .csproj dosyasına EmitCompilerGeneratedFiles özelliğini ekleyebilirsiniz.

<Project Sdk="Microsoft.NET.Sdk.Web">

<PropertyGroup>
<!-- Diğer özellikler burada yer alır -->
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>
</PropertyGroup>

</Project>

Dotnet build komutunu çalıştırarak üretilen kodları görebilirsiniz. Çıktı, projenin tüm üretilen dosyalarını içeren bir obj/Debug/net8.0/generated/ dizinini içerir.

CreateEmptyBuilder Yöntemi

CreateEmptyBuilder yöntemi, Web uygulamaları oluşturmak için kullanılan bir WebApplicationBuilder Factory yöntemidir. Bu yöntem, yalnızca gerekli özellikleri içeren küçük uygulamalar oluşturmak için tasarlanmıştır. Bu nedenle, bu uygulamalar yalnızca Service ve Middleware yapılarını içerir. CreateEmptyBuilder yöntemi, geliştiricilere uygulamalarını istedikleri şekilde özelleştirmeleri için geniş bir esneklik sunar.

var builder = WebApplication.CreateEmptyBuilder(new WebApplicationOptions());
builder.WebHost.UseKestrelCore();

var app = builder.Build();

app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Hello, World!");
await next(context);
});

Console.WriteLine("Running...");
app.Run();

CreateEmptyBuilder ve Native AOT

Bu yöntem, özellikle .NET 8 ile tanıtılan “Native AOT” derlemesiyle bir araya geldiğinde büyük bir öneme sahiptir. Bu derleme türü, uygulamaların daha hızlı başlatılmasını, daha küçük boyutta olmasını ve daha az bellek tüketmesini sağlar. Küçük uygulamalar, bu hedeflere daha kolay ulaşabilir ve daha az gereksiz özelliği içerir.

Örneğin, bu kodun “Native AOT” kullanarak .NET 8 Preview 7 ile linux-x64 makinesinde yayımlandığınızda, yaklaşık 8.5 MB boyutunda bağımsız bir Local Application oluşturulur.

Azalan Uygulama Boyutu

Özellikle, HTTPS veya HTTP/3 desteğine ihtiyaç duymayan uygulamalar için bu azalma büyük bir avantajdır. Örneğin, Azure gibi bir TLS sonlandırma proxy’si arkasında çalıştırılan uygulamalar için HTTPS veya HTTP/3 desteğine ihtiyaç duyulmayabilir.

HTTPS veya HTTP/3 desteği gerektirmeyen uygulamalar için, WebApplication.CreateSlimBuilder yöntemi bu işlevselliği varsayılan olarak hariç tutar. Ancak, gerektiğinde HTTPS veya HTTP/3 desteği eklemek mümkündür. HTTPS eklemek için builder.WebHost.UseKestrelHttpsConfiguration() yöntemi kullanılırken, HTTP/3 eklemek için builder.WebHost.UseQuic() yöntemi kullanılır. Bu, uygulamanın ihtiyaçlarına göre yapılandırılabilir bir yaklaşım sunar ve gereksiz özelliklerin eklenmesini önler.

HTTP/3 ile ilgili daha önce hazırlamış olduğum video:

Son Olarak

.NET 8 ile gelen native AOT desteği, yazılım uygulamalarının performansını ve verimliliğini artırmak için önemli bir adımı temsil ediyor. Bu yeni yaklaşım, uygulamaların daha küçük boyutlu olmasını, daha az bellek kullanmasını ve daha hızlı başlamasını sağlayarak geliştiricilere önemli avantajlar sunuyor. Ancak, uyumluluk sorunları göz önüne alındığında, native AOT için güncellemeler yapmak gerekebilir. Bu, .NET 8'in getirdiği yeniliklerin, yazılım ekosisteminde büyük bir değişiklik getirdiği anlamına geliyor ve gelecekte daha fazla AOT destekli uygulama ve kütüphane görmemiz muhtemel.

Kaynak

--

--

Erkan Güzelküçük
Erkan Güzelküçük

Written by Erkan Güzelküçük

Software Architecture and Research Applications Development Team Leader at Koç University