Yazılım

C# Performans Optimizasyonu – Bölüm 1 Döngüler

Merhabalar,Bu yazı serisinde C# programlama diline yönelik optimizasyon tekniklerine değineceğiz. Serinin ilk yazısı olan bu yazıda, döngülerin nasıl daha verimli hale getirebileceğimizi ve bu sayede ne tür kazanımlar elde edeceğimizi inceleyelim;

Foreach yerine for döngüsü kullanmayı düşünün

 

Foreach döngüsü hayatımızı kolaylaştırsa da bazı istisnalar dışında for döngüsü daha iyi performans göstermektedir. Bu durumu aşağıdaki kodu inceleyerek açıklamaya çalışalım.

 

clip_image001

Testler sonucunda for döngüsünün 3 kat daha hızlı tamamlandığı görülmektedir. Peki, neden for döngüsü daha hızlı çalışmaktadır?

Buna sebep olan derleyicinin foreach döngüsü için arka planda enumerator object kullanmasıdır. Derleyici tarafından foreach döngüsü için oluşturulan IL çıktısı aşağıdadır;

clip_image002

Çıktıda kolayca fark edebileceğiniz üzere her bir döngüde sayılar listesinin Enumerator sınıfındaki metotlar çağırılmaktadır. Bu durum foreach döngüsünün daha yavaş çalışmasına sebep olmaktadır.

 

Koleksiyonlar üzerinde inline döngülerden kaçının

Teknik olarak aşağıdaki iki döngünün aynı sonucu vereceğini ve arada bir hız farkı olmayacağını düşünebilirsiniz. Eğer böyle düşünüyorsanız aradaki farkı görünce fikriniz değişecektir.

clip_image003

Test sonuçlarında yerel değişken olarak tanımlanmış koleksiyon ile döngü içerisinde inline olarak kullanılan koleksiyon arasındaki hız farkı bariz bir şekilde görülmektedir. Bu durum bir önceki örnekte bahsedilen Enumerator çağırma ile bağlantılıdır ve kaçınılması gerekir.

 

Gerektiğinde paralel döngüleri tercih edin

 

Eğer döngü içerisinde yoğun işlemci gücü gerektiren kodlar çalıştırıyorsanız paralel döngüler performans artışı sağlayabilir. Bu döngüler standart döngüler gibi sıralı değil paralel olarak çalışmaktadır. Bu sayede işlemci gücü maksimum oranda kullanılır.

 

clip_image004

 

ToString() metodunu dikkatli kullanın

 

Özellikle döngüler içerisinde gereksiz tür dönüşümlerinden kaçının. String türündeki bir değeri tekrar string’e dönüştürmek bedava değildir ve aşağıdaki örnekte olduğu gibi 40 kat daha yavaş çalışabilir.

 

clip_image005

 

 

Diğer öneriler

 

For döngülerini tersine (azalan) şekilde çalıştırmak X86 tabanlı bazı işlemcilerde performans artışı sağlayabilir.

 

clip_image006

Eğer döngüde işiniz bittiyse döngüden çıkın.

clip_image007

 

Bu yazıda önerilen teknikler test edildiği bilgisayar konfigürasyonuna göre farklılık gösterebilir. Ancak mühim olan doğru tekniği uygulamak ve daha performanslı çalışan kodu ortaya çıkartmaktır.

Geliştirdiğiniz uygulama, kütüphane, API vb. çalışmalar için optimizasyonu daha kodu yazarken ilk aşamada bir rutin haline getirmenizi tavsiye ederim.

Hepinize teşekkür ederim.

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

İlgili Makaleler

2 Yorum

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Başa dön tuşu