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.
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;
Çı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.
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.
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.
Diğer öneriler
For döngülerini tersine (azalan) şekilde çalıştırmak X86 tabanlı bazı işlemcilerde performans artışı sağlayabilir.
Eğer döngüde işiniz bittiyse döngüden çıkın.
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.
kısa öz ve faydalı bilgi çin teşekkürler
Eline Sağlık Volkan.