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.

Artikel yang Disarankan
Mengapa Akar Kuadrat merupakan Operasi yang Lambat di C#?
Pengantar C#
7 Tips Efektif Belajar C# Lebih Cepat
Panduan untuk Menulis dan Mengambil Data dari Kode Multi-thread di C#
Menangani Aliran Data Oktet di C#
Panduan Laptop Utama untuk Pengembang C#
Pemrograman Asinkron di C#