.NET 10'da PipeReader ile büyük JSON verisini okumak
Ali Hamza Ansari, .NET 10'un System.Text.Json kütüphanesine eklediği PipeReader aşırı yüklemesini, büyük bir JSON yükünü Stream ile okumayla karşılaştırıyor. Çalışma süresi, ayrılan bellek ve GC koleksiyonları ölçülüyor. Yoğun istek alan API'lerde deserializasyon maliyetini azaltıp azaltmayacağı için okumaya değer.
Kilit noktalar
- System.Text.Json, .NET 10 ile PipeReader alan bir deserializasyon aşırı yüklemesi sunuyor.
- Yazarın testinde PipeReader yolu Stream yoluna göre yaklaşık yüzde 21 daha hızlı çalıştı.
- Ölçümler bir milyon kayıtlık tek bir dosya ve tek bir makine üzerinde yapıldı.
- PipeReader kullanıldığında PipeReader.CompleteAsync() çağrısı ile okuyucunun kapatılması gerekir.
- Toplam bellek ayırımı biraz artabilir; kazanç GC baskısının azalmasından gelir.
- Karar vermeden önce kendi payload boyutunuzla ve GC sayaçlarınızla ölçüm yapın.
elmah.io blogundan Ali Hamza Ansari, .NET 10 ile gelen PipeReader aşırı yüklemesinin büyük bir JSON dosyasının deserializasyonunu ne kadar hafifletebileceğini test ediyor. Örnekte bir minimal API, bir milyon telemetri kaydı içeren yaklaşık 72 MB'lık bir dosya üretiyor ve aynı dosyayı önce bir Stream üzerinden, sonra aynı akıştan oluşturulan bir PipeReader ile okuyor. Her ölçümden önce GC zorlanıyor ve süre, ayrılan bellek ile Gen0/Gen1/Gen2 koleksiyon sayıları kaydediliyor.
Yazara göre PipeReader yolu yaklaşık yüzde 21 daha hızlı çalışmış ve GC baskısı azalmış. Küçük bir ek ayırmanın, büyük nesne yığınındaki (LOH) yoğunluğu azaltmak için değdiğini savunuyor. Ancak sonuçlar tek bir makinede yapılmış basit bir demodan geliyor; kendi yük profilinizde ölçmeden sıcak bir endpoint'i değiştirmemek gerekir.
Gerçek dünyada kullanımı
- Büyük toplu veri yükleyen (bulk import) ASP.NET Core minimal API'si
- Yüksek trafikli ve büyük gövdeli telemetri veya IoT veri alım endpoint'i
- Büyük JSON dosyalarını işleyen arka plan işçisi
Neden önemli
Büyük JSON gövdelerini sık işleyen servislerde deserializasyonun GC maliyeti gerçek bir darboğaz olabilir. PipeReader aşırı yüklemesi, bunu Stream tabanlı kodda küçük bir değişiklikle deneyebileceğiniz bir seçenek sunuyor.
Benzer haberler
- Middleware'de istek gövdesini okumak ikinci okuyucuyu boş bırakırDEV Community: #aspnetcore6 gün önce
- Cache-Control header'ı output cache değildir: handler sayacıyla kanıtDEV Community: #aspnetcore22 Eki
- xAPI 2.0 için .NET kütüphanesi ve LRS geliştirirken öğrenilenlerDEV Community: #aspnetcore17 Eki