C# Por que a divisão é mais lenta que a multiplicação?

Nas linguagens de programação e especificamente C# existem 4 operações aritméticas que podem ser realizadas: adição, subtração, multiplicação e divisão.

E de uma perspectiva externa, pode parecer que todos eles são semelhantes em termos de desempenho, mas acontece que um deles é muito mais lento em comparação com os outros 3.

Qual deles é mais lento, você pode perguntar? Divisão.

De acordo com este artigo da HP:

A divisão de ponto flutuante e a raiz quadrada demoram consideravelmente mais para serem calculadas do que a adição e a multiplicação. Os dois últimos são calculados diretamente, enquanto os primeiros são geralmente calculados com um algoritmo iterativo. A abordagem mais comum é usar uma iteração de Newton-Raphson sem divisão para obter uma aproximação do recíproco do denominador (divisão) ou da raiz quadrada recíproca e, em seguida, multiplicar pelo numerador (divisão) ou argumento de entrada (raiz quadrada).

Para verificar a afirmação acima decidi fazer um teste simples usando o código abaixo:

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

Basicamente, executei um milhão de adições, subtrações, multiplicações e divisões para os dois números aleatórios e medi o tempo que cada um deles levou para processar, o teste foi repetido 5 vezes e aqui está o resultado:

  • A adição levou em média 0,0004 segundos
  • A subtração levou em média 0,0003 segundos
  • A multiplicação levou em média 0,0003 segundos
  • A divisão levou em média 0,0044 segundos

O resultado mostrou que adição, subtração e multiplicação são semelhantes em termos de desempenho, mas a divisão parece ser cerca de 1100% mais lenta.

Não é uma diferença pequena, o que leva à conclusão de que é sempre melhor usar a multiplicação em vez da divisão sempre que possível. Por exemplo, quando você precisa dividir o número por 2, é melhor multiplicá-lo por 0,5.

Artigos sugeridos
Por que a raiz quadrada é uma operação lenta em C#?
7 dicas eficazes para aprender C# mais rápido
O que é C#?
Introdução ao C#
Explorando funções-chave em C#
Um guia para escrever e recuperar dados de código multithread em C#
Dominando os fundamentos da programação C#