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.