.NET Performans & Nesne Eşleme Stratejileri 4 dk okuma 18 okunma

ObjectMapper Kullanımının Performansa Etkisi

ObjectMapper'lar (AutoMapper, Mapster, Mapperly) DTO-entity dönüşümlerini kolaylaştırır ancak performans etkileri farklıdır. AutoMapper runtime reflection/expression tree kullanır; Mapster daha hızlıdır; Mapperly ise derleme zamanında kod üretir ve en yüksek performansı sunar. Kritik nokta: eşleme genellikle darboğaz değildir; asıl maliyet veritabanı sorgusundadır. Projeksiyon (Select) ile eşlemeyi veritabanına taşımak, tüm mapper'lardan daha etkilidir.

ObjectMapper Kullanımının Performansa Etkisi

ObjectMapper Kullanımının Performansa Etkisi

Nesne eşleme (object mapping), bir katmandan diğerine veri taşırken (entity → DTO gibi) neredeyse her .NET projesinde karşılaşılan bir ihtiyaçtır. AutoMapper yıllardır bu işin standardı olsa da, performans etkisi ve alternatifleri konusunda önemli farklar vardır. Bu yazıda, popüler ObjectMapper'ların performans özelliklerini ve doğru kullanım stratejilerini ele alacağız.


1. ObjectMapper'ların Temel Performans Farkları

ObjectMapper'lar, eşleme kodunu nasıl ürettiklerine göre iki ana kategoriye ayrılır:

A. Runtime Reflection / Expression Tree Tabanlılar (AutoMapper, Mapster)

Bu araçlar, eşleme kurallarını çalışma zamanında yorumlar veya derler. AutoMapper, eşleme planlarını önbelleğe alarak tekrarlı reflection maliyetini azaltır, ancak yine de runtime'da expression tree değerlendirmesi yapar .

B. Derleme Zamanı Kaynak Üreticileri (Mapperly)

Mapperly, eşleme kodunu derleme zamanında C# kodu olarak üretir. Çalışma zamanında reflection veya expression tree yoktur; üretilen kod, elle yazılmış eşleme kadar hızlıdır .

Benchmark Karşılaştırması (.NET 10, güncel sürümler):

Araç Yaklaşım Göreli Hız Bellek
Mapperly Derleme zamanı kod üretimi En hızlı (~30ns) En düşük
Manuel Eşleme Elle yazılmış Çok hızlı (~34ns) Düşük
AutoMapper Runtime expression tree Daha yavaş (~72ns) Daha yüksek
Mapster Runtime (code-gen opsiyonel) AutoMapper'a yakın (~67ns) Benzer

Bir benchmark'ta Mapperly, manuel eşlemeden bile hızlı çıkmış ve %10 daha az bellek tahsis etmiştir . Daha eski benchmark'larda AutoMapper'ın manuel eşlemeden ~1.2-1.3 kat daha yavaş ve ~%5-10 daha fazla bellek tükettiği görülmüştür .


2. En Kritik Soru: Eşleme Gerçekten Darboğaz mı?

Code Maze'in 2026 değerlendirmesi, bu konudaki en önemli uyarıyı yapıyor: "Nesne eşleme nadiren bir uygulamanın darboğazıdır. Nesne başına birkaç yüz nanosaniye, tek bir veritabanı gidiş-dönüşünün yanında önemsiz kalır."

Yani, eğer profiler'ınızda eşleme açık ara en büyük maliyet olarak görünmüyorsa, mapper değiştirmek anlamlı bir kazanç sağlamaz. Asıl odaklanılması gereken genellikle şudur:

  • Gereksiz veri çekimi (tüm entity'yi yükleyip sonra DTO'ya dönüştürmek).

  • N+1 sorguları.

  • Eksik index'ler.

Stack Overflow'daki bir tartışmada, bir geliştirici AutoMapper'ın yüksek yük altında ek yük getirdiğinden şikayet etmiş; ancak yanıtlar, sorunun büyük olasılıkla tüm Users tablosunu ve ilişkilerini belleğe yüklemek olduğunu, AutoMapper'ın değil, EF Core'un sorumlu olduğunu göstermiştir .


3. En Etkili Optimizasyon: Projeksiyon (Select)

Mapper performansından bağımsız olarak, en büyük kazanç eşlemeyi veritabanına taşımaktır. Entity'yi çekip bellekte DTO'ya dönüştürmek yerine, Select ile doğrudan DTO projeksiyonu yapmak:

  • Veritabanından yalnızca ihtiyaç duyulan sütunları çeker (daha az I/O, daha az bellek).

  • Ara entity koleksiyonu oluşturmaz (daha az GC baskısı).

  • Eşleme maliyetini ortadan kaldırır (veritabanı zaten DTO şeklinde döner).

csharp

// Kötü: Tüm entity'yi yükle, sonra DTO'ya dönüştür
var users = await _context.Users.Include(u => u.Roles).ToListAsync();
var dtos = _mapper.Map<List<UserDto>>(users);

// İyi: Doğrudan DTO'ya projeksiyon yap
var dtos = await _context.Users
    .Select(u => new UserDto
    {
        Id = u.Id,
        Name = u.Name,
        RoleNames = u.Roles.Select(r => r.Name).ToList()
    })
    .ToListAsync();

Bu yaklaşım, hangi mapper'ı kullanırsanız kullanın, en yüksek getiriyi sağlar .


4. Ne Zaman Hangi Yaklaşım?

Senaryo Öneri
Yüksek trafikli API, sıcak yol Mapperly (derleme zamanı, sıfır reflection) veya projeksiyon
Genel iş uygulamaları, orta trafik AutoMapper veya Mapster (üretkenlik ve okunabilirlik)
Native AOT hedefleniyorsa Mapperly (tam AOT uyumlu)
Büyük koleksiyonlar (10.000+ kayıt) Projeksiyon + gerekirse Mapperly
Legacy kod tabanı, AutoMapper zaten derinlemesine kullanılıyorsa Geçiş maliyeti faydayı aşmıyorsa kalabilir

AutoMapper Lisans Uyarısı (2026): AutoMapper 15.1 ve sonrası ticari lisans gerektirir (5M$ altı gelir için ücretsiz). Ayrıca 14.0.0 ve öncesi, yamalanmamış yüksek önem dereceli bir DoS açığı (CVE-2026-32933) taşır. Yeni projelerde bu, alternatifleri değerlendirmek için ek bir neden olabilir .


5. En İyi Pratikler

Pratik Açıklama
Önce profilleme yapın Eşleme gerçekten darboğaz mı? Ölçmeden mapper değiştirmeyin .
Projeksiyonu tercih edin Select ile DTO'ya doğrudan projeksiyon, tüm mapper'lardan daha etkilidir .
Sıcak yolda derleme zamanı mapper kullanın Mapperly, reflection'sız yapısıyla en hızlısıdır .
AsNoTracking() kullanın Sadece okuma için entity çekiyorsanız, Change Tracker yükünü kapatın .
Mapper'ı her istekte yeniden oluşturmayın IMapper veya TypeAdapterConfig örneklerini singleton/scoped olarak yönetin ve cache'leyin .

Sonuç

ObjectMapper'lar, kod tekrarını azaltan ve okunabilirliği artıran araçlardır; ancak performans etkileri, kullanılan araca ve kullanım biçimine göre değişir. Mapperly, derleme zamanı kod üretimiyle en yüksek performansı sunar; AutoMapper ve Mapster ise runtime maliyetiyle birlikte üretkenlik sağlar. Ancak en önemli gerçek şudur: Eşleme genellikle darboğaz değildir. Asıl kazanç, gereksiz veri çekimini ortadan kaldırmak ve eşlemeyi veritabanına (projeksiyon) taşımaktır. Unutmayın: En hızlı mapper, hiç ihtiyaç duyulmayan mapper'dır; en iyi optimizasyon, ölçülmüş ve doğrulanmış olandır.

Tüm yazılar Soru ya da yorumun mu var? Yaz