C# Чому ділення повільніше, ніж множення?

У мовах програмування, зокрема C#, є 4 арифметичні операції, які можна виконувати: додавання, віднімання, множення та ділення.

І ззовні може здатися, що всі вони схожі за продуктивністю, але виявляється, що один із них набагато повільніший порівняно з іншими трьома.

Ви можете запитати, який із них повільніший? Ділення.

Відповідно до цього документа HP:

Ділення з плаваючою комою та квадратний корінь обчислюються значно довше, ніж додавання та множення. Останні два обчислюються безпосередньо, тоді як перші зазвичай обчислюються за допомогою ітераційного алгоритму. Найпоширенішим підходом є використання ітерації Ньютона-Рафсона без ділення, щоб отримати наближення до зворотної величини знаменника (поділу) або зворотного квадратного кореня, а потім помножити на чисельник (поділ) або вхідний аргумент (квадратний корінь).

Щоб перевірити наведене вище твердження, я вирішив виконати простий тест за допомогою наведеного нижче коду:

        //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");

По суті, я провів мільйони операцій додавання, віднімання, множення та ділення для двох випадкових чисел і виміряв час обробки кожного з них, тест повторили 5 разів, і ось результат:

  • Додавання займало в середньому 0,0004 секунди
  • Віднімання займало в середньому 0,0003 секунди
  • Множення займало в середньому 0,0003 секунди
  • Ділення займало в середньому 0,0044 секунди

Результат показав, що додавання, віднімання та множення схожі за продуктивністю, але ділення, здається, приблизно на 1100% повільніше.

Невелика різниця, яка приводить до висновку, що завжди краще використовувати множення замість ділення, коли це можливо. Наприклад, коли вам потрібно розділити число на 2, краще помножити його на 0,5.

Рекомендовані статті
Чому квадратний корінь є повільною операцією в C#?
Посібник із написання та отримання даних із багатопотокового коду на C#
Найкращий посібник для ноутбуків для розробників C#
Вступ до C#
7 ефективних порад, щоб швидше вивчити C#
Поради щодо пошуку роботи мрії для початківців C#-розробників
Обробка октетних потоків даних у C#