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.