2017-02-03 6 views
1

Ich habe eine Frage über den Vergleich der Geschwindigkeit von Vector.Length und Math.sqrt. Ich habe den folgenden Code zum Vergleichen der Geschwindigkeit verwendet.Warum ist die vector.Length schneller als Math.sqrt()?

int cnt = 100000; 
double result = 0; 
Vector A = new Vector(1.342,2.0); 
Vector B = new Vector(5.1234,2.0); 
Stopwatch sw = new Stopwatch(); 

sw.Start(); 
while(cnt-- > 1) 
{ 
    Vector AB = A-B; 
    result = AB.Length; 
} 
sw.Stop(); 
System.Console.WriteLine("Vector : " + sw.Elapsed); 
sw.Reset(); 

cnt = 100000; 
sw.Start(); 
while(cnt-- >1) 
{ 
result = Math.Sqrt((B.X-A.X)*(B.X-A.X)+(B.Y-A.Y)*(B.Y-A.Y)); 
} 
sw.Stop(); 
System.Console.WriteLine("Sqrt : " + sw.Elapsed); 

Ergebnis:

Vector : 00:00:00.0019342 
Sqrt : 00:00:00.0041913 

Das Ergebnis zeigt, dass Vector.Length schneller als Math.Sqrt() ist. Ich denke, Vector.Length berechnet Länge mit Math.Sqrt() auch. dann ist Vector.Length gleich oder langsamer als Math.Sqrt(). Warum unterscheidet es sich von dem, was ich denke? Wie wird Vector.Length berechnet?

+0

Ich denke, Grund ist, weil in Mathe ist es ratsam, Quadrate als tatsächliche Zahlen. Am Ende fügt man einfach eins hinzu und wendet Sqrt auf das Ergebnis an. – eocron

+1

Sie müssen den JIT auch zuerst "aufwärmen", indem Sie den Code ausführen, an dem Sie die Leistung messen. –

+1

Sie vergleichen Äpfel und Orangen. Sie wissen nicht, was der Compiler in Bezug auf die Optimierung Ihres Codes tut ... nur um zu beginnen. – Fildor

Antwort

1
Vector : 00:00:00.0019342 

Nein, das ist viel zu langsam auf fast jede Maschine . Erzählt uns, was Sie falsch gemacht haben, Sie haben den Debug-Build Ihres Programms ausgeführt. Grundlegende Gegenmaßnahmen, um sicherzustellen, Sie genaues Timing erhalten:

  • Erstellen> Configuration Manager> Aktiv Lösungskonfiguration combobox> select Freigabe
  • eine for-Schleife um den Code Setzen Sie den Test 10 mal laufen, entledigt Startüberkopfeffekte
  • Extras> Optionen> Debuggen> Allgemein> untick der "Unterdrückt JIT-Optimierung" Checkbox

Ausgabe auf meinen faulen Laptop:

Vector : 00:00:00.0000975 
Sqrt : 00:00:00.0000917 
Vector : 00:00:00.0000912 
Sqrt : 00:00:00.0000917 
Vector : 00:00:00.0000917 
Sqrt : 00:00:00.0000917 
Vector : 00:00:00.0000912 
... etc 

Genau so schnell, wie es sein sollte. Diese Messung ist für den x86-Jitter, der neue x64-Jitter, der in VS2015 veröffentlicht wurde, macht Vector.Length weniger effizient.

Wie Sie sagen, das Optimierungsprogramm in den Jitter gebaut ist sehr wichtig effizienten Code zu erhalten. Es gab Vector.Length die Kante in Ihrem ursprünglichen Test, es wurde optimiert, wenn das .NET Framework auf Ihrem Computer installiert wurde. Der Job, der von NGen.exe erledigt wird. Mehr darüber, was der Optimierer in this answer macht.

2

Ihr Test ist zu schnell, das ist, wie Vector.Length definiert:

public double Length 
{ 
    get 
    { 
     return Math.Sqrt((this._x * this._x) + (this._y * this._y)); 
    } 
} 

und minus Operator:

public static Vector operator -(Vector vector1, Vector vector2) 
{ 
    return new Vector(vector1._x - vector2._x, vector1._y - vector2._y); 
} 
Verwandte Themen