BenchmarkDotNet ile Performans Testleri

Murat Dinç
Devops Türkiye☁️ 🐧 🐳 ☸️
5 min readDec 15, 2022

BenchmarkDotNet performans ölçümlerini elde etmek için belirli kod satırlarını birbiriyle veya tek başına kıyaslamaya yarar ve kodunuzun geniş ölçekte nasıl çalışacağını anlamada son derece önemli bilgiler verir.

Geliştirdiğimiz kodun performansı ile ilgili çeşitli veriler sunarak kodun performansı ile ilgili bize yönlendirici bilgiler verir.

Kodunuzu kıyaslama birçok şekilde olabilir. Projelerinizde New Relic gibi Uygulama Performansı İzleme (APM) bazen canlı kıyaslama araçları kullanabilirsiniz fakat BenchmarkDotNet paketini kullanarak performans süreçlerini takım ve şirket içerisinde barındırıp özel senaryolar ile kodunuzu istediğiniz kriterlerde test edebilirsiniz.

Kısaca BenchmarkDotNet

Dotnet Foundation‘ın desteklediği BenchmarkDotNet, bir .NET kütüphanesi olup performans ölçüm işlemlerinde kullanılmaktadır.

Çeşitli ölçümlere metodları, çıktı genişliği vb bir çok gelişmiş yetenekleri sayesinde geniş bir ölçümleme imkanı sunmaktadır

Desteklediği Framework: Full .NET Framework, .NET Core, Mono
Desteklediği diller: C#, F#, Visual Basic
Raporlama Türleri: markdown, csv, html, plain text, png

Çıktı Türleri

Kütüphanenin bize sunmuş olduğu en büyük özelliklerden biri ise test çıktılarını popüler formatlarda alma imkanının geniş olmasıdır.

Resim üzerinden belirtilmiş olan formatlar kütüphanenin desteklediği formatlardır.

Varsayılan olarak test sonuçları csv, html, text plain formatlarında çıkmaktadır fakat bunlar istenildiği şekilde genişletilip ve ya daraltılabilir şekilde çıktı sağlanabilmektedir.

Desteklenen çıktı türleri

- Framework bazında test imkanı

BenchmarkDotNet bize yazdığımız kodu farklı framework üzerindeki sonuçlarını karşılaştırma imkanı sunar.

Yazdığımız kod her framework üzerinde yapısal değişiklikler nedeni ile farklı sonuçlar verebilir.

Örnek bir kodun framework bazında performans testi sonuçları

- Job Tipleri

Kütüphanede kullanılan Job özelliği testlerin hangi ortam ve şartlarda çalıştırılacağını belirler. Testlerin nasıl çalıştırılacağı konusunda kütüphaneye yön veren özelliklerdir. Standart olarak gelen job bilgileri aşağıdaki gibidir.

Not: Testlerinizi birden çok job üzerinde çalıştırabilirsiniz

Kütüphane üzerinde hazır bulunan Job listesi

- Çıktı Kolonları

Test sonuçları için desteklenen kolonlar mevcuttur. Bu kolonlar desteklenen tipler de azaltılıp veya çoğaltılabilir.

Mean: Tüm ölçümlerin ortalaması
StdDev: Standart sapma
Rank: Çıktıya göre verilen sıralama puanı

- Diagnosers

Testimizi hangi ölçüm metodu ile yapmak istiyor isek burada devreye Diagnosers özelliği devreye giriyor. Bu özellik ben ölçümü bellek üzerinde yapmak, CPU üzerinde yapmak istiyorum gibi sorulara cevap vermektedir.

Varsayılan olarak pakette gelen ölçüm metodları aşağıdaki gibidir;

Memory Diagnoser Çalışma Mantığı

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.

Gerekli bilgilendirmelerden sonra demolarımız üzerinden sonuçlara bakıp bilgileri pekiştirme imkanı bulabiliriz 😊

Örnek Testler

Örnek projemizde bir kaç örneklendirme yaparak konuyu pekiştirmek istedim.

Projemizde Program.cs dosyası üzerinden ilgili testi açarak ilerleyebilirsiniz.

Dilerseniz bütün testleri aynı anda çalıştırabilirsiniz. Normalde parametrik olarak Console tarafından test koşturabilirsiniz fakat anlaşılması açısından testleri açıklama satırı halinde tek tek ekledim :)

Demo 1

Md5, Sha256, Sha512 algoritmalarını karşılaştıran uygulama

Uygulamamızda ki genel amaç seçtiğimiz şifreleme algoritmalarının birbirleriyle olan performans karşılaştırmasını ortaya çıkarmak ve buna göre uygulama kararı vermek

Algoritmayı kullanarak performans problemini sonradan fark etmek yerine şimdi fark edip normalden fazla filtre kahve tüketmemek ve sabaha kadar sorunu aramamak için iki algoritmanın performanslarına bir bakalım ✋

Sonuçları incelediğimizde karşılaştırma listemizde SHA256 methodunun en performanslı çalışan algoritma olduğunu görebiliriz.

Demo 2

Newtonsoft.Json ile System.Text.Json paketlerini karşılaştıran uygulama

İki paket arasında kaldık ama hangisini kullanacağımız konusunda şüphelerimiz var. Bu şüpheleri gidermek için iki kütüphane arasındaki farkları araştırma yoluna gittik ve paketin bize verdiği nimetlerden faydalanmaya karar verdik.

İki adet yarış atımız var ama bu koşuda hangisinin koşacağı sorusuna cevabı bulalım 🏇

Sonuçlardan anlayacağımız gibi System.Text.Json açık ara önde diyebiliriz System.Text.Json 😊

Demo 3

HttpClient ile RestSharp sınıflarını karşılaştıran uygulama

Yazdığımız kod ne kadar kaliteli olursa olsun kullandığımız paketin önemi ciddi fark yaratabilir. Bu farklar ürün genelinde kritik değerleme oluşturacak seviyede yükselebilir ve bu durum geliştirici açısından pek hoş olmayabilir.

Aslında cevabını bulmaya çalıştığımız soru çok basit;

Audi marka bir araç almak istiyoruz ve en net kriterimiz performans. Almak istediğimiz aracın modelinde net bir kararımız var fakat aracın yaşı arasında takıldık 😰

2010 yılında üretilmiş bir A6 model ile 2022 yılında üretilmiş bir A6 model arasındaki farkı anlamak için piste çıkmak dışında yapabileceğimiz bir şey yok hadi direksiyona geçelim ve bakalım 🚗

Aslında iki sonuç birbirine çok yakın hangisini kullanmak isterseniz bu sonuçlara göre hareket edebilirsiniz

Demo 4

Cold Start

Sürekli kullandığımız bir sınıf olduğunu olduğunu düşünürsek bu sınıfın ilk ayağa kalktığı zamanı tespit etmek isteyebiliriz.

Otomobillerin yakıt tüketiminin en fazla olduğu an motorunun soğuk iken ilk çalıştığı andır. Biz de kodun ilk çalıştığı anı test edeceğiz ve kaynaklarımızı ne kadar tükettiğini ortaya çıkaracağız.

Test için kullandığımız sınıfın ilk ayağa kalktığı zaman ne kadar kaynak tükettiğini görmüş olduk.

Sonuçlara göre karar aşaması

Her proje için kabul edilebilir süreler ve baremler farklıdır. Projenizde kabul edilir bir oran belirleyip bunun üzerinden testlerini koşturabilirsiniz.

Test Çıktılarının Fiziksel Dosyaları

Testlerimizi yaparken test çıktılarımız varsayılan olarak projemizin altında oluşmaktadır.

İstediğimiz çıktı türlerine göre bu dosyalar oluşmaktadır. Biz sadece CSV ve HTML olarak çıktı talep etmiştik o sonuçlarda results klasöründe yer almaktadır.

Bir sonraki yazıda görüşmek üzere 😊

--

--