C# Hvorfor division er langsommere end multiplikation?

I programmeringssprog og specifikt C# er der 4 aritmetiske operationer, der kan udføres: addition, subtraktion, multiplikation og division.

Og set udefra kan det se ud til, at de alle er ens med hensyn til ydeevne, men det viser sig, at en af ​​dem er meget langsommere sammenlignet med de andre 3.

Hvilken er langsommere spørger du måske? Division.

Ifølge dette HP-papir:

Flydende kommadivision og kvadratrod tager betydeligt længere tid at beregne end addition og multiplikation. De to sidstnævnte beregnes direkte, mens førstnævnte normalt beregnes med en iterativ algoritme. Den mest almindelige tilgang er at bruge en divisionsfri Newton-Raphson iteration for at få en tilnærmelse til den reciproke af nævneren (division) eller den reciproke kvadratrod og derefter gange med tælleren (division) eller input-argumentet (kvadratrod).

For at bekræfte udsagnet ovenfor besluttede jeg at køre en simpel test ved hjælp af 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");

Grundlæggende kørte jeg en million additioner, subtraktioner, multiplikationer og divisioner for de to tilfældige tal og målte den tid, hver af dem tog at behandle, testen blev gentaget 5 gange, og her er resultatet:

  • Tilføjelse tog i gennemsnit 0,0004 sekunder
  • Subtraktion tog i gennemsnit 0,0003 sekunder
  • Multiplikation tog i gennemsnit 0,0003 sekunder
  • Division tog i gennemsnit 0,0044 sekunder

Resultatet viste, at addition, subtraktion og multiplikation er ens med hensyn til ydeevne, men division ser ud til at være omkring 1100 % langsommere.

Ikke en lille forskel, hvilket fører til den konklusion, at det altid er bedre at bruge multiplikation i stedet for division, når det er muligt. For eksempel, når du skal dividere tallet med 2, er det bedst at gange det med 0,5 i stedet for.

Foreslåede artikler
Hvorfor er Square Root en langsom operation i C#?
Introduktion til C#
En guide til at skrive og hente data fra flertrådskode i C#
Tips til at få et drømmejob til håbefulde C#-udviklere
Arnes C# Chronicles and Coding Best Practices
Håndtering af oktetdatastrømme i C#
Ultimativ tastaturguide til C#-udviklere