2016-05-30 9 views
0

Bei der Berechnung der Entfernung zwischen zwei 3D-Punkten in Java kann ich die Entfernung oder die Entfernung im Quadrat zwischen ihnen berechnen, wobei ein Aufruf von Math.sqrt vermieden wird.Tatsächliche Leistungsvorteile der Entfernung im Quadrat im Vergleich zur Entfernung

Native, ich habe gelesen, dass sqrt nur ein Viertel der Geschwindigkeit der Multiplikation ist, die die Unannehmlichkeit der Verwendung der Entfernung im Quadrat nicht lohnt.

In Java, was ist der absolute Leistungsunterschied zwischen Multiplikation und Berechnung einer Quadratwurzel?

+2

Den einzigen Weg, zu beantworten dieser „absolut“ zu Benchmark ist der Unterschied in Ihrem Code einer „praktische“ Antwort wollen. [Obligatory link] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java) –

+0

Meine Tests zeigen, dass 'dx * dx + dy * dy 'läuft ungefähr doppelt so schnell wie' Math.sqrt (dx * dx + dy * dy) '. Du hast * "Viertel der Geschwindigkeit" * erwähnt, was 4-mal Unterschied bedeutet. Wenn 2 oder 4 mal schneller für Sie keine Rolle spielt, spielt es keine Rolle, oder? In der Gesamtstruktur der Dinge ist es nur wichtig, wenn Sie es * viel * tun. ** Vorsicht vor vorzeitigen Optimierungen. ** Korrigieren Sie Ihren Code, wenn Sie ein Problem messen, nicht aufgrund (fehlerhafter?) Annahmen über die Leistung. – Andreas

+0

Berechnen einer Entfernung nimmt die Quadratwurzel der quadratischen Entfernung. Es gibt keinen Kompromiss, die Quadratwurzel ist reiner Overhead. Wie lange es auch dauern mag, ist die Zeit, die die Berechnung einer normalen Distanz zusätzliche quadrierte Distanz benötigt. – harold

Antwort

0

I Am Anfang dieses als Kommentar hinzufügen wollte, aber es begann zu bieten zu bekommen, geht so hier:

es selbst ausprobieren. Erstellen Sie eine Schleife mit 10.000 Iterationen, wobei Sie einfach a*a + b*b und eine weitere separate Schleife berechnen, in der Sie Math.sqrt(a*a + b*a) berechnen. Zeit es und du wirst es wissen. Die Berechnung eines ist ein iterativer Prozess für sich, bei dem die digitale (Computer-Bits) Quadratwurzel näher an der realen Quadratwurzel der gegebenen Zahl konvergiert, bis sie ausreichend nahe ist (sobald der Unterschied zwischen jeder Iteration kleiner als ein wirklich kleiner Wert ist)). Es gibt mehrere Algorithmen neben der einen die Math Bibliothek verwendet und ihre Geschwindigkeit hängt von der Eingabe und wie der Algorithmus entworfen wird. Stick mit Math.sqrt(...) meiner Meinung nach, kann nicht schief gehen und es wurde von einer Menge Leute getestet.

Obwohl dies für eine Quadratwurzel sehr schnell durchgeführt werden kann, gibt es einen definitiv beobachtbaren Zeitunterschied.

Nebenbei bemerkt: Ich kann mir keinen Grund vorstellen, die Quadratwurzel mehr als einmal zu berechnen, normalerweise am Ende. Wenn Sie den Abstand zwischen Punkten wissen möchten, verwenden Sie einfach den quadratischen Wert dieser Entfernung als Standard und machen Sie Vergleiche/Summierungen/Subtraktionen oder was immer Sie möchten, basierend auf diesem Standard.

PS: mehr Code zur Verfügung, falls Sie