logo Unutmayayım diye yazdıklarım...


C#'da Operator'lerin Performansı

02.01.2010 tarihinde oğuzhan tarafından yazıldı.

Yine opensource bir uygulamanın kodlarını incelerken bazı yerleri refactor ettiğimde daha hızlı çalıştığını gördüm. Revize ettiğim yerlerde genelde operator'lerin kullanımı ile alakalıydı. Böyle bir kaç gereksiz ve performans düşürücü kod ile karşılaşınca da operatör performans'ı ile ilgli birşeyler yazmaya kadar verdim ;)

Sık sık kullandığım ve kullanmaya dikkat ettiğim karar verici operatörlerin kullanım yerleri ve karşılaştırmalarını basit olarak gösteren giriş seviyesi bir yazı oldu.

C# Condition'lar

Condition'dan kastımız if, switch, :?, ?? gibi operatörlerin yerine göre kullanı mı, karar verme mekanizmalarınızın hızlı olmasını sağlayacaktır. Örnek vermek gerekirse aşağıdaki gibi string karşılaştırması yapacaksanız switch kullanmanız en performanslı sonucu almanızı sağlayacaktır.


        static void switchCondition(string hayvan)
        {
            switch (hayvan)
            {
                case "At":
                    break;
                case "Öküz":
                    break;
                case "Eşşek":
                    break;
                case "Kedi":
                    break;
                case "Köpek":
                    break;
                case "Ejderha":
                    break;
                default:
                    break;
            }
        }

Bu kodun aynısını if blok'u ile de yapmanız mümkün fakat her ne olursa olsun switch bu durumda çok daha hızlı çalışacaktır. Gel gelelim switch'inde kötü performans verdiği yerler var. Aşağıdaki if kullanımı da switch'den daha performanslı çalışacaktır.

        static bool IfOrCondition(string hayvan)
        {
            return (hayvan == "At" || hayvan == "Öküz" || hayvan == "Eşşek" || hayvan == "Kedi" || hayvan == "Köpek" || hayvan == "Ejderha");
            
        }

Bu kodun birde switch karşılığını elealırsak aşağıdaki gibi yapı çıkıyor. Burda da if daha hızlı karar veriyor.

        static bool switchOrCondition(string hayvan)
        {
            switch (hayvan)
            {
                case "At":
                case "Öküz":
                case "Eşşek":
                case "Kedi":
                case "Köpek":
                case "Ejderha":
                    return true;
                default:
                    return false;
            }
        }

Bire bir değer karşılatırırken de == (Eşittir) operatörü yerine Equals metodunu kullanmanız performansınızı hızlandıracak bir harekettir. Bunu ufak bir test programı yazarak karşılaştırdım ve aşağıdaki gibi bir sonuç çıktı.

        static void EqualsCondition(string hayvan)
        {
            if (hayvan.Equals("At"))
            {

            }
            else if (hayvan.Equals("Öküz"))
            {

            }
            else if (hayvan.Equals("Eşşek"))
            {

            }
            else if (hayvan.Equals("Kedi"))
            {

            }
            else if (hayvan.Equals("Köpek"))
            {

            }
            else if (hayvan.Equals("Ejderha"))
            {

            }
        }

==         : 9,7233 ms
Equals    : 0,8875 ms

Özellikle string karşılaştırırken Equals kullanmanız performans açısından yararınıza olacaktır.

Bazı durumlarda da ne if, nede switch kullanmanız gerekmez, Diğer dillerde olduğu gibi C#'da da Inline kullanılabilecek operatörler vardır ve gerektiğinde kullanılırsa hem kodunuz daha kolay okunur hemde performans kazanırsınız. If kullanarak uzun uzun oluşturduğunuz bu kod bloğunu.

        static bool IfConditional(string hayvan)
        {
            if (hayvan.Equals("Ejderha"))
                return true;
            else
                return false;
        }

Inline bir conditional operatör kullanarak aşağıdaki şekilde az kod ile ve daha hızlı çalışır vaziyete getirebilirsiniz.

        static bool Conditional(string hayvan)
        {
            return hayvan.Equals("Ejderha") ? true : false;
        }

Bu iki kod arasındaki karşılaştırma sonucunda da aşağıdaki gibi bir sonuç çıktı.

If    : 0,9262ms
:?    : 0,4659ms

Inline kullanabileceğimiz diğer bir operatörde ?? operatörü'dür. Herhangi bir nesnenin null olup olmadığını kontrol eder eğer null ise belirleyeceğiniz değeri nesnenin değerine atar. Bu operatörü yine if ile karşılşatırırsak aşağıdaki gibi bir If kullanımını.

        static string IfAssigmentOp(string hayvan)
        {
            if (hayvan == null)
                return "Ejderha";
            else
                return hayvan;
        }

?? operatörü kullanarak refactor edebiliriz.

        static string AssigmentOp(string hayvan)
        {
            return hayvan ?? "Ejderha";
        }

Tahmin edeceğiniz gibi bu kod'da if bloğu kullanarak oluşturulmuş kod'dan hızlı ve kısa'dır.



 

#ekimdusu-, 27.03.2010 18:30:41 tarihinde demiş ki...
çok kaliteli bir makale olmuş yürekten kutlarım,

aynı şekilde for-while karşılaştırmaları ile ilgili bir çalışma olursa çok makbule geçer
#haydar-, 12.05.2010 23:47:36 tarihinde demiş ki...
== : 9,7233 ms
Equals : 0,8875 ms

=='in bu kadar etkisi olmasına çok şaşırmış durumdayım.
#Nazmi Altun+, 04.08.2010 00:43:52 tarihinde demiş ki...
Güzel çalışma.

Yorum Yapın
İsim (String)
Mail (String)
4, 4 daha yapar. (Int)

*NVarChar*3 + html desteğide yok.
(bit)
Sosyal Ağ Antenleri
Blog RSSLinkedinFacebookFlickrTwitterFriendfeedGoogle ReaderYoutubegit
  • Açılış
  • Projelerim
  • Arşiv
  • İletişim
  • En çok ilgi görenler...

    HP IPAQ 914c
    Mikrotik
    NETSH'dan faydalanmak
    Togi Twitter Client
    Mikrotik ADSL Bridge.
    Netsis SQL Raporları.
    SQL Server Optimizasyonu.
    VBScript.Encode - Encode
    C# ile DataGridView den Excel 'e
    C# ile mail gönder
    Netsis SQL Server Değişikliği.
    Windows Sunucularda SYN Atakları.

    Rastgele birşeyler...

    Yeni çıkan Windows R...
    C# DataGridView: Sys...
    Devresel Ödeme...
    Nhibernate : IDENTIT...
    Fanstastik Hata :)...
    Pownce...
    Vishing'den Haberdar...
    SQLyog Enterprise...
    Msn Kişisel İleti Si...
    Visual Studio 2005 K...
    Siteye yeni özellik....
    Yeni Msn Eklentim : ...
    ASP, MySQL, Türkçe K...
    IIS 6.0 İçin birşey ...
    Silverlight ile Stre...
    Küresel ısınmayı dur...

    Şebeke

    WHT, Fıroİş, Denizİş, Serkan, Semih, Sewgi, Beşir, İzgençvos, Erkan, Mumin, Aliİş, Lütfü, Alper, Yusuf

    2003 - Oğuzhan YILMAZ
    Bir şey alıntıladığınız zaman kaynak göstermeniz yeterli.


    Web Hosting Sponsor Vargonen Technologiies