C# Hvorfor er divisjon tregere enn multiplikasjon?

I programmeringsspråk og spesifikt C# er det 4 aritmetiske operasjoner som kan utføres: addisjon, subtraksjon, multiplikasjon og divisjon.

Og fra et eksternt perspektiv kan det virke som om alle er like når det gjelder ytelse, men det viser seg at en av dem er mye tregere sammenlignet med de andre 3.

Hvilken er tregere spør du kanskje? divisjon.

I følge dette HP-papiret:

Flytepunktdivisjon og kvadratrot tar betydelig lengre tid å beregne enn addisjon og multiplikasjon. De to sistnevnte beregnes direkte mens de førstnevnte vanligvis beregnes med en iterativ algoritme. Den vanligste tilnærmingen er å bruke en divisjonsfri Newton-Raphson iterasjon for å få en tilnærming til den resiproke av nevneren (divisjon) eller den resiproke kvadratroten, og deretter multiplisere med telleren (divisjon) eller input-argumentet (kvadratrot).

For å bekrefte uttalelsen ovenfor bestemte jeg meg for å kjøre en enkel test ved å bruke koden nedenfor:

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

I utgangspunktet kjørte jeg en million addisjoner, subtraksjoner, multiplikasjoner og divisjoner for de to tilfeldige tallene og målte tiden hver av dem tok å behandle, testen ble gjentatt 5 ganger, og her er resultatet:

  • Tilsetning tok i gjennomsnitt 0,0004 sekunder
  • Subtraksjon tok i gjennomsnitt 0,0003 sekunder
  • Multiplikasjon tok i gjennomsnitt 0,0003 sekunder
  • Divisjon tok i gjennomsnitt 0,0044 sekunder

Resultatet viste at addisjon, subtraksjon og multiplikasjon er like når det gjelder ytelse, men divisjon ser ut til å være rundt 1100 % langsommere.

Ikke en liten forskjell, noe som fører til konklusjonen at det alltid er bedre å bruke multiplikasjon i stedet for divisjon når det er mulig. For eksempel, når du trenger å dele tallet på 2, er det best å multiplisere det med 0,5 i stedet.

Foreslåtte artikler
Hvorfor er Square Root en langsom operasjon i C#?
Introduksjon til C#
En guide til å skrive og hente data fra flertrådskode i C#
Tips for å få en drømmejobb for ambisiøse C#-utviklere
Arnes C# Chronicles and Coding Best Practices
Håndtere oktettdatastrømmer i C#
Ultimate bærbar guide for C#-utviklere