BenchmarkDotNet ile .NET performansını AI yardımıyla ölçmek ve kanıtlamak
Yazar, BenchmarkDotNet ile bir .NET raporlama metodunu adım adım optimize ediyor ve her değişikliği ayrı ayrı ölçüyor. Yapılan değişikliklerle süre yaklaşık 1,55 saniyeden 11,9 milisaniyeye, bellek tahsisi 33,1 MB'tan 0,23 MB'a düşüyor. Yapay zekânın önerdiği optimizasyonları neden ölçmek ve çıktıyı doğrulamak gerektiğini görmek için okumaya değer.
Kilit noktalar
- Yapay zekâdan optimizasyon istemeden önce BenchmarkDotNet ve [MemoryDiagnoser] ile ölçüm yapın.
- Her seferinde tek bir değişiklik yapın ve her adımın süresini ve tahsisini kaydedin.
- İç içe Where taraması yerine tek geçişli Dictionary hesaplaması en büyük kazancı sağladı (1,5 s'den 40 ms'ye).
- StringComparer.Ordinal ile HashSet ve TryGetAlternateLookup<ReadOnlySpan<char>> .NET 9 ve sonrasında satır başına string tahsisini önler.
- Benchmark sayılarına güvenmeden önce her sürümün çıktısını orijinal sonuçla karşılaştırın.
Yazar, yapay zekânın performans önerilerinin çoğunun ölçülmediğini savunuyor: bazıları hiçbir şey değiştirmiyor, bazıları kodu yavaşlatıyor, bazıları da davranışı sessizce değiştiriyor. Örnekte, sipariş satırlarını ayrıştıran, müşteri başına toplam hesaplayan, engelli müşterileri atlayan ve ilk on kaydı döndüren bir rapor metodu ele alınıyor. Süreç bir BenchmarkDotNet ölçümü ve projenin kural dosyasıyla başlıyor; yapay zekâdan sıralı hipotezler ve her seferinde tek bir değişiklik isteniyor.
Değişiklikler ayrı ayrı uygulanıyor: Dictionary ile tek geçişli hesaplama müşteri başına iç içe taramayı kaldırıyor, HashSet engelli müşteri aramalarını hızlandırıyor, .NET 9 ile gelen alternate lookup ve span tabanlı ayrıştırma ise tahsisleri büyük ölçüde azaltıyor. Her sürüm ölçümden önce orijinal çıktıyla karşılaştırılıyor. .NET 10 üzerinde süre yaklaşık 1,55 saniyeden 12 milisaniyeye, bellek tahsisi 33 MB'tan 0,23 MB'a düşüyor.
Gerçek dünyada kullanımı
- Büyük sınırlandırılmış metin dosyalarını ayrıştırıp müşteri bazında toplam çıkaran gece toplu işleri.
- Sık çağrılan ve GC baskısı yaratan bir ASP.NET Core raporlama endpoint'i.
- Repodaki bir benchmark ile desteklenen, yapay zekânın ürettiği performans yamalarını pull request üzerinde incelemek.
Neden önemli
Yapay zekânın performans önerileri birer hipotez olarak ele alınmalı; ölçüm ve çıktı karşılaştırması hangi değişikliğin gerçekten işe yaradığını ve davranışın bozulmadığını gösterir.