C# Bölme Neden Çarpmadan Daha Yavaştır?

Programlama dillerinde ve özellikle C# gerçekleştirilebilecek 4 aritmetik işlem vardır: toplama, çıkarma, çarpma ve bölme.

Dışarıdan bakıldığında performans açısından hepsi benzer gibi görünebilir, ancak bir tanesinin diğer 3'üne göre çok daha yavaş olduğu ortaya çıkıyor.

Hangisinin daha yavaş olduğunu sorabilirsiniz? Bölme.

bu HP kağıdına: göre

Kayan noktalı bölme ve karekökün hesaplanması, toplama ve çarpma işlemlerinden çok daha uzun sürer. Son ikisi doğrudan hesaplanırken, ilki genellikle yinelemeli bir algoritma ile hesaplanır. En yaygın yaklaşım, paydanın (bölme) veya karşılıklı karekökün tersine bir yaklaşım elde etmek için bölmeden bağımsız bir Newton-Raphson yinelemesi kullanmak ve ardından pay (bölme) veya giriş argümanı (karekök) ile çarpmaktır..

Yukarıdaki ifadeyi doğrulamak için aşağıdaki kodu kullanarak basit bir test yapmaya karar verdim:

        //Generate two random numbers
        var rand = new System.Random();
        float a = rand.Next();
        float b = rand.Next();

        Debug.Log("Number a: " + a + " Number b: " + b);

        System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();

        watch.Start();
        //Addition
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a + b;
        }
        watch.Stop();
        //Output
        Debug.Log("Addition took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

        watch.Reset();
        watch.Start();
        //Subtraction
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a - b;
        }
        watch.Stop();
        //Output
        Debug.Log("Subtraction took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

        watch.Reset();
        watch.Start();
        //Multiplication
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a * b;
        }
        watch.Stop();
        //Output
        Debug.Log("Multiplication took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

        watch.Reset();
        watch.Start();
        //Division
        for (int i = 1; i < 1000000; i++)
        {
            float tmp = a / b;
        }
        watch.Stop();
        //Division
        Debug.Log("Division took: " + watch.Elapsed.TotalSeconds.ToString("0.0000") + " seconds");

Temel olarak, iki rastgele sayı için bir milyon toplama, çıkarma, çarpma ve bölme işlemi yaptım ve her birinin işlenme süresini ölçtüm, test 5 kez tekrarlandı ve işte sonuç:

  • Toplama işlemi ortalama 0,0004 saniye sürdü
  • Çıkarma işlemi ortalama 0,0003 saniye sürdü
  • Çarpma işlemi ortalama 0,0003 saniye sürdü
  • Bölünme ortalama 0,0044 saniye sürdü

Sonuç, toplama, çıkarma ve çarpma işlemlerinin performans açısından benzer olduğunu ancak bölme işleminin %1100 civarında daha yavaş olduğunu gösterdi.

Küçük bir fark değil, bu da mümkün olduğunca bölme yerine çarpmayı kullanmanın her zaman daha iyi olduğu sonucuna varmamızı sağlıyor. Örneğin, sayıyı 2'ye bölmeniz gerektiğinde, bunu 0,5 ile çarpmak en iyisidir.

Önerilen Makaleler
C#'ta Karekök Neden Yavaş Bir İşlemdir?
C#'ı Daha Hızlı Öğrenmek için 7 Etkili İpucu
C#'ta Çok İş parçacıklı Koddan Veri Yazma ve Alma Kılavuzu
C# Uygulamalarında Formant İşleme
C# Geliştiricileri için Mükemmel Fare Kılavuzu
C# Geliştiricileri için Mükemmel Klavye Kılavuzu
C# Geliştiricileri için En İyi Dizüstü Bilgisayar Kılavuzu