C# Warum ist Division langsamer als Multiplikation?

In Programmiersprachen und insbesondere C# gibt es vier arithmetische Operationen, die ausgeführt werden können: Addition, Subtraktion, Multiplikation und Division.

Und von außen betrachtet mag es vielleicht so aussehen, als seien alle von der Leistung her ähnlich, aber es stellt sich heraus, dass einer von ihnen im Vergleich zu den anderen drei viel langsamer ist.

Welches ist langsamer, fragen Sie sich vielleicht? Division.

Laut diesem HP-Papier:

Die Berechnung von Gleitkommadivision und Quadratwurzel dauert erheblich länger als die Berechnung von Addition und Multiplikation. Die beiden letztgenannten werden direkt berechnet, während erstere normalerweise mit einem iterativen Algorithmus berechnet werden. Der gebräuchlichste Ansatz besteht darin, eine Divisionsfreie Newton-Raphson-Iteration zu verwenden, um eine Annäherung an den Kehrwert des Nenners (Division) oder der reziproken Quadratwurzel zu erhalten, und diese dann mit dem Zähler (Division) oder dem Eingabeargument (Quadratwurzel) zu multiplizieren..

Um die obige Aussage zu überprüfen, habe ich beschlossen, einen einfachen Test mit dem folgenden Code durchzuführen:

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

Im Grunde habe ich eine Million Additionen, Subtraktionen, Multiplikationen und Divisionen für die beiden Zufallszahlen durchgeführt und die Zeit gemessen, die jede von ihnen zur Verarbeitung benötigte. Der Test wurde fünfmal wiederholt, und hier ist das Ergebnis:

  • Die Zugabe dauerte durchschnittlich 0,0004 Sekunden
  • Die Subtraktion dauerte durchschnittlich 0,0003 Sekunden
  • Die Multiplikation dauerte durchschnittlich 0,0003 Sekunden
  • Die Division dauerte durchschnittlich 0,0044 Sekunden

Das Ergebnis zeigte, dass Addition, Subtraktion und Multiplikation hinsichtlich der Leistung ähnlich sind, die Division jedoch etwa 1100 % langsamer zu sein scheint.

Kein kleiner Unterschied, was zu dem Schluss führt, dass es immer besser ist, wann immer möglich, Multiplikation statt Division zu verwenden. Wenn Sie beispielsweise die Zahl durch 2 teilen müssen, multiplizieren Sie sie am besten stattdessen mit 0,5.