in Eski Blog Yazılarım

C#’da Operator’lerin Performansı

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.

Yorum Bırak

Comment