Mir ist aufgefallen, daß die Pow()-Funktion (Potenzieren) ziemlich langsam arbeitet. Ziel des folgenden Beispiel-Snippets ist es, die Distanz von 2 Punkten mit dem Satz des Pythagoras zu berechnen. Dabei nutze ich drei Methoden
- grobe Schätzung über x/y-Achsen, kein SdP
- Satz des Pythagoras mit Pow()
- Satz des Pythagoras ohne Pow(), also ausgeschrieben
Jede Methode rechnet 100000000 (= 100 Millionen) mal dieselbe Formel durch, und gibt danach die Zeit aus, die benötigt wurde. Ich habe den Test sowohl mit Debugger als auch ohne Debugger durchgeführt:
Code: Alles auswählen
EnableExplicit
Define x0,y0,x1,y1
Define distance.f
Define i
Define timer
x0 = 2
y0 = 2
x1 = 7
y1 = 8
OpenConsole("")
timer = ElapsedMilliseconds()
For i = 1 To 100000000
distance = Abs(x0-x1)+Abs(y0-y1)
Next
PrintN("Schätzung: "+distance)
PrintN("Millisecs: "+Str(ElapsedMilliseconds()-timer))
PrintN("")
timer = ElapsedMilliseconds()
For i = 1 To 100000000
distance = Sqr(Pow((x0-x1),2)+Pow((y0-y1),2))
Next
PrintN("Satz des Pythagoras: "+distance)
PrintN("Millisecs: "+Str(ElapsedMilliseconds()-timer))
PrintN("")
timer = ElapsedMilliseconds()
For i = 1 To 100000000
distance = Sqr(((x0-x1)*(x0-x1))+((y0-y1)*(y0-y1)))
Next
PrintN("ohne Pow(): "+distance)
PrintN("Millisecs: "+Str(ElapsedMilliseconds()-timer))
PrintN("")
PrintN("Press ENTER") : Input()
Ergebnis (mit Debugger): ~ 6208 ms
Ergebnis (ohne Debugger): ~ 338 ms
SdP mit Pow():
Ergebnis (mit Debugger): ~ 20307 ms
Ergebnis (ohne Debugger): ~ 13231 ms
SdP ohne Pow():
Ergebnis (mit Debugger): ~ 7144 ms
Ergebnis (ohne Debugger): ~ 813 ms
Auffällig an diesem Ergebnis ist, daß die ohne Pow() ausgeschriebene Variante nicht nur 3x so schnell läuft, sondern die Berechnung ohne Debugger mit den Varianten ohne Pow() einen rund 10-20fachen Geschwindigkeitsboost erfährt, die Pow()-Variante ohne Debugger aber gerade mal ein Drittel schneller läuft.
Und falls es jemanden interessiert, hier derselbe Test in Blitzbasic/Blitz3D (das Potenzieren erledigt in BB der ^-Operator):
Code: Alles auswählen
Global x0,y0,x1,y1
Global distance#
Global i
Global timer
x0 = 2
y0 = 2
x1 = 7
y1 = 8
timer = MilliSecs()
For i = 1 To 100000000
distance = Abs(x0-x1)+Abs(y0-y1)
Next
Print "Schätzung: "+distance
Print "Millisecs: "+(MilliSecs()-timer)
Print
timer = MilliSecs()
For i = 1 To 100000000
distance = Sqr(((x0-x1)^2)+((y0-y1)^2))
Next
Print "Satz des Pythagoras: "+distance
Print "Millisecs: "+(MilliSecs()-timer)
Print
timer = MilliSecs()
For i = 1 To 100000000
distance = Sqr(((x0-x1)*(x0-x1))+((y0-y1)*(y0-y1)))
Next
Print "ohne ^: "+distance
Print "Millisecs: "+(MilliSecs()-timer)
Print
Print "Press ENTER"
WaitKey()
Ergebnis (mit Debugger): ~ 4782 ms
Ergebnis (ohne Debugger): ~ 547 ms
SdP mit Pow():
Ergebnis (mit Debugger): ~ 19324 ms
Ergebnis (ohne Debugger): ~ 14975 ms
SdP ohne Pow():
Ergebnis (mit Debugger): ~ 4801 ms
Ergebnis (ohne Debugger): ~ 540 ms