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.