Tag Archives: benchmark

BenchmarkDotNet | Baseline ve Jobs 3. Kısım

BenchmarkDotNet içerisinde baseline ve Jobs konularına baktık bu videoda. Bu video benchmarkdotnet içerisinde şu konulara göz attık;

💎 Baseline

[Benchmark(baseline = true)]

public void Sleep200() ==> Thread.Sleep(200);

💎 SimpleJobs

[SimpleJob]

💎 RunStrategy

[SimpleJob(runStrategy: RunStrategy.Throughput)] 

💎 RuntimeMoniker

[SimpleJob(runtimeMoniker: RuntimeMoniker.Net50)] 

💎 Orderer

[Orderer(SummaryOrderPolicy.SlowestToFastest)]

Özellikle RuntimeMoniker kullanırken seçtiğiniz ortamlara ait SDK’ları bilgisayarınıza kurmayı ve projenizin csproj dosyasına hedef ortam bilgisini TargetFrameworks tag’leri arasına yazmayı unutmayın.

Kaynak: https://benchmarkdotnet.org/articles/overview.html

BenchmarkDotNet | Parametrelendirme 2. Kısım

Benchmarkdotnet içerisinde parametrelendirme özelliklerinden bahsettim bu videoda.

✅ Best Practices

➡️Release build (debug mode 10-100 kat daha yavaş)

➡️Farklı ortamları deneyin (CLR, .NET Framework ve JIT)

➡️Math.Exp(1); şeklinde ölü kodları engelleyin (JIT bu kodları optimize ediyor). Mümkünse return Math.Exp(1); şeklinde kullanın.

➡️Standart OS process’leri ve benchmark process’i hariç diğer tüm process’leri öldürün.

➡️Bilgisayarını şarja takın ve maksimum performans modunda çalıştırın.

✅ İterasyonlar

➡️Pilot: Seçilecek en iyi işlem sayısı.

➡️OverheadWarmup, OverheadWorkload: Değerlendirilecek ek yük.

➡️ActualWarmup: Isınma süreci.

➡️ActualWorkload: Gerçek ölçümler.

➡️Result = ActualWorkload – MedianOverhead

Kaynak: https://benchmarkdotnet.org/articles/features/parameterization.html

BenchmarkDotNet | Kurulumu ve Temelleri 1. Kısım

Yazdığınız bir kod parçası ne kadar verimli? Az önce yaptığınız değişiklik uygulamanızı iyileştirecek mi? Bunu nereden biliyorsunuz? Bu değişiklik ne kadar önemliydi? Bunlar kıyaslama yani benchmarking yapmadan cevaplanamayacak sorular. Bu video serisinde, kodun ne kadar verimli olduğunu belirlemek için Benchmarkdotnet‘in kodu değerlendirmek için nasıl kullanılacağına ve ardından kodun değiştirilmiş bir versiyonuna kıyasla ne kadar verimli olduğuna bakacağız.

BenchmarkDotNet, yöntemleri karşılaştırma ölçütlerine dönüştürmenize, performanslarını izlemenize ve tekrarlanabilir ölçüm deneylerini paylaşmanıza yardımcı olur. Birim testleri yazmaktan daha zor değil! BenchmarkDotNet sizi popüler kıyaslama hatalarından korur ve kıyaslama tasarımınızda veya elde ettiğiniz ölçümlerde bir sorun olduğunda sizi uyarır. Sonuçlar, denemenizle ilgili tüm önemli gerçekleri vurgulayan kullanıcı dostu bir biçimde sunulur. Proje, .NET Runtime dahil olmak üzere 6800’den fazla proje tarafından benimsenmiş ve .NET Foundation tarafından desteklenmektedir.

Tipik bir durumda ne yapmanız gerektiğini düşünelim. İlk olarak, bir pilot deney yapmalı ve en iyi yöntem çağırma sayısını belirlemelisiniz. Ardından, birkaç ısınma yinelemesi gerçekleştirmeli ve karşılaştırma ölçütünüzün sabit bir duruma ulaştığından emin olmalısınız.

Elle yazılmış birçok kıyaslama, yanlış iş kararlarına yol açan yanlış sayılar üretir. BenchmarkDotNet, sizi kıyaslama tuzaklarının çoğundan korur ve yüksek ölçüm hassasiyeti elde etmenizi sağlıyor.

Mükemmel yöntem çağırma sayısı, ısınma ve gerçek yineleme sayısı hakkında endişelenmemelisiniz: BenchmarkDotNet en iyi kıyaslama parametrelerini seçmeye çalışır ve ölçüm öngörüsü ile tüm kıyaslama çalıştırmalarının toplam süresi arasında iyi bir denge elde etmeye çalışır.

Videoda neler öğrendik?

➡️ Benchmark attribute kullanımı

➡️ MemoryDiagnoser attribute kullanımı

➡️ BenchmarkRunner.Run kullanımı

✅ Gen 0, Gen 1 ve Gen 2 nedir ve nasıl çalışır?

Küçük .NET nesneleri, küçük heap’lere tahsis edilir. Bunlardan üç tane vardır: Gen 0, Gen 1 ve Gen 2. Gen 0’a yeni nesneler yerleştirilir.

Gen 0 dolduğunda, .NET Garbage Collector çalışır, artık ihtiyaç duyulmayan nesneleri elden çıkarır ve diğer her şeyi Gen 1’e taşır. Gen 1 dolarsa, GC yeniden çalışır, aynı zamanda Gen 1’deki nesneleri Gen 2’ye taşır.

Gen 2 dolduğunda tam bir GC çalışması gerçekleşir. Bu, gereksiz Gen 2 nesnelerini temizler, Gen 1 nesnelerini Gen 2’ye taşır, ardından Gen 0 nesnelerini Gen 1’e taşır ve son olarak referans verilmeyen her şeyi temizler.

Kaynaklar:

✔️ https://benchmarkdotnet.org/

✔️ https://www.red-gate.com/products/dotnet-development/ants-memory-profiler/learning-memory-management/memory-management-fundamentals