C# Mengapa Pembagian Lebih Lambat Dibandingkan Perkalian?
Dalam bahasa pemrograman khususnya C# ada 4 operasi aritmatika yang dapat dilakukan: penjumlahan, pengurangan, perkalian, dan pembagian.
Dan dari segi performa mungkin terlihat semuanya serupa, namun ternyata salah satunya jauh lebih lambat dibandingkan 3 lainnya.
Yang mana yang lebih lambat, Anda mungkin bertanya? Divisi.
Menurut kertas HP ini:
Pembagian floating point dan akar kuadrat membutuhkan waktu lebih lama untuk dihitung dibandingkan penjumlahan dan perkalian. Dua yang terakhir dihitung secara langsung sedangkan yang pertama biasanya dihitung dengan algoritma berulang. Pendekatan yang paling umum adalah dengan menggunakan iterasi Newton-Raphson bebas pembagian untuk mendapatkan perkiraan kebalikan dari penyebut (pembagian) atau akar kuadrat timbal balik, dan kemudian mengalikannya dengan pembilang (pembagian) atau argumen masukan (akar kuadrat).
Untuk memverifikasi pernyataan di atas saya memutuskan untuk menjalankan tes sederhana menggunakan kode di bawah ini:
//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");
Pada dasarnya, saya menjalankan sejuta penjumlahan, pengurangan, perkalian, dan pembagian untuk dua bilangan acak tersebut dan mengukur waktu yang dibutuhkan masing-masing bilangan tersebut untuk memprosesnya, pengujian diulangi sebanyak 5 kali, dan inilah hasilnya:
- Penambahan rata-rata membutuhkan waktu 0,0004 detik
- Pengurangan rata-rata membutuhkan waktu 0,0003 detik
- Perkalian rata-rata membutuhkan waktu 0,0003 detik
- Pembagian rata-rata membutuhkan waktu 0,0044 detik
Hasilnya menunjukkan bahwa penjumlahan, pengurangan, dan perkalian serupa dalam hal performa, namun pembagian tampaknya lebih lambat sekitar 1100%.
Perbedaannya tidak kecil, yang mengarah pada kesimpulan bahwa selalu lebih baik menggunakan perkalian daripada pembagian bila memungkinkan. Misalnya, saat Anda ingin membagi suatu bilangan dengan 2, sebaiknya kalikan saja dengan 0,5.