Ist Der Mathematik.max(a,b) oder (a>b)?a:b schneller in Java?
Welche ist schneller in Java, und warum?
Math.max(a,b)
(a>b)?a:b
(Dies wurde in einem interview gefragt.)
- Ich Frage mich, was der interviewer war in der Hoffnung zu gewinnen, indem Sie Fragen, eine solche Frage.
- sollten Sie Fragen zurück, das ist leichter zu Lesen schnell, das ist viel wichtiger. Math.max(a,b) AUSDRÜCKLICH zeigt, dass es Absicht besser so, dass ist die richtige Antwort
- Ich hasse es, wenn Leute Fragen, Sprache, Rechtsanwalt Fragen in einem Vorstellungsgespräch. Hat jemand wirklich denken, dass Ihre Fähigkeit zu einer produktiven Programmierer ist stark korreliert mit Ihrer Fähigkeit, merken Sie sich die Einzelheiten der Sprache Skillung?
- Wen interessiert das und warum macht sich jemand dafür interessieren?
- Die korrekte Antwort auf diese Frage ist (von einem compiler im hintergrund) es hängt davon ab, was der Optimierer wählen, um zu tun mit dem Aufruf der Funktion. Es ist KEINER WEISE, um zu bestimmen, die Geschwindigkeit, Optimierung der oben genannten Anrufe, ohne zu wissen, 1. Der Kontext für die Ausführung und 2. der Optimierer bevorzugt inline-Methode für die aufrufende Argumente. Vermutungen (wie unten) vorgenommen werden können, Sie sind aber nur Vermutungen. Ich Stimme mit @dsimcha diese Fragen nicht wirklich sagen nichts über Ihre Fähigkeiten.
- Ich kann schreiben Sie eine jvm, wo man ist wesentlich schneller als der andere, oder Umgekehrt 😉
- Das ist vielleicht ein Einblick in den code, den Sie sind, über zu arbeiten mit. Ich kann sehen, dass der Arbeitgeber code voller bugs, wobei (a < b) wurde geschrieben, Unfall, aber spart 13 Taktzyklen pro Woche.
- WTF hat das mit Sprache zu tun Skillung?
- Ich würde mir wünschen, dass der Gesprächspartner versucht, zu bestimmen, ob der interviewer sich sinnlos microoptimisation.
- Ich höre dir zu, @dsimcha -- aber ich wirklich hasse mehr wenn die Leute Fragen hier, Sie könnten sich einfach informieren, durch ausführen einer einfachen test, in Ihren eigenen Umgebungen. Wie schwer wäre es gewesen, girinie, für Sie, um einen test zwischen den beiden Optionen?
- Ich habe auf der Empfängerseite von dieser Art von Frage, und Sie sind in der Regel mehr darüber, wie Sie die Frage beantworten, als das, was die 'richtige' Antwort ist.
- Argh, es ist dieses Ding, Aufzucht seinen Kopf wieder: mydeveloperconnection.com/html/JavaTrap.htm so, wie es hier: stackoverflow.com/questions/1656506/...
- Doppel-arrggghhhh
- neuere Verwandte Frage: stackoverflow.com/questions/22752198/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Math.max(a, b)
ist eine statische Funktion (d.h. keine virtuelle call-overhead) und wahrscheinlich werden eingebettet, indem Sie die JVM auf die gleiche Weise wie(a > b) ? a : b
.(a>b)?a:b
. Oder Umgekehrt, die beste, die Sie tun können, mit Mathematik.max() ist, es zu konvertieren, um(a>b)?a:b
und, dass die Umstellung Zeit braucht.Hier ist die openjdk code für
Math.max()
in Java:So, der code würde vermutlich (fast) genau die gleiche Geschwindigkeit.
(Um ehrlich zu sein, wenn Sie sich Gedanken über Verbesserungen in der Geschwindigkeit auf einem so niedrigen Niveau, werden Sie wahrscheinlich haben weit grössere Probleme in Ihrem code.)
a
undb
sind gleich, die machen es noch schlimmer. Ich kenne jemand, der etwas sagt über die Methode lookups aber, ehrlich gesagt, nicht, verwenden Sie Java, falls Sie das interessieren. Wenn jemand siehtMath.max
Sie wissen, was Sie tun und das ist es, was zählt.a == b
schlimmer sein? Nehmen wir an, dassa
undb
sind wirklich randomint
s. Dann würde nichta > b
Filiale gleich oft alsa >= b
?>=
statt=
würde es nur verwenden, die andere route, wenn die Werte gleich sind. Und aktuellen Java-VMs erreichen erstaunliche Leistung auch für low-level-Operationen, die manchmal schwer zu schlagen, auch von C oder ASM. Hohe Leistung und Java ist nicht unbedingt ein Widerspruch mehr, wenn Sie wissen, was zu vermeiden ist.Leistung Fragen rufen Sie immer für einen test, bevor Sie beginnen können, darüber zu spekulieren:
Diese läuft auf meinem Rechner 6 Sekunden mit
Math.max()
und 3.2 Sekunden?:
auf dem neuesten 1.6.1 x64-server von Sun JVM. So?:
ist tatsächlich schneller. Im Gegensatz zu all den Hoffnungen, die wir gerne in die JITs, die haben wirklich erstaunlich, durch die Zeit, die Sie noch nicht fangen alles.EDIT: Aus Neugier habe ich auch versucht, diesen code mit dem 32-bit-client-JVM 1.6.1 auf der gleichen Maschine und mit diesem beide Versionen laufen in 7 Sekunden! Also es ist wahrscheinlich nicht die Methode invocation, die nicht inline, sondern die server-JIT zu sein scheint in der Lage zu tun, einige zusätzliche Optimierungen, die für diesen speziellen test Fall, dass es nicht erkennen kann, wenn es einen Aufruf der Methode beteiligt.
Math.max
ist definiert leicht anders als Ihre alternativen, und Sie fast immer den gleichen Weg (kann verursachen selten deoptimisation, wenn Sie nicht)>=
und>
in der Bedingung und die Ausführung Zeit blieb die gleiche.Wenn ich gefragt hätte, eine solche Frage in einem interview, ich hätte erwartet, dass der Kandidat, um mir zu sagen, dass die beiden Ausdrücke können nicht das gleiche Ergebnis für alle möglichen Typen von a und b.
Verlassen Sie sich nicht auf Spekulation. Stattdessen benchmark Ihren Anwendungsfall.
Einige leicht übersehene details in den vielen anderen Antworten:
Während Sie können sehen, eine Java-Quelle
Math.max
, das ist eigentlich nicht immer, was verwendet wird. Diese Methode hat ein intrinsische version in so ziemlich jeder JRE. Finden Sie die source-code der Hotspot in JDK7,vmSymbols.hpp
für eine Liste von solchen Interna.Soweit ich das beurteilen kann-Hotspot wird versuchen, eine Reihe von Optimierungen, wenn es sieht
max
odermin
Anweisung; insbesondere ist zu optimieren, z.B.arraycopy
. Unter anderem ist es tatsächlich optimierenMath.max(same, same)
entfernt.In anderen Fällen, jedoch, es kann nicht viel optimieren;
(a<=b)?a:b
kann dann sogar schneller sein. Ich habe benchmarking ein bisschen, und in der Tat habe ich oft festgestellt, dass dies schneller sein. Aber YMMV, und es ist definitiv hängt vom Kontext ab, wenn Hotspot optimieren können, eine besser oder der andere. Es wird auch variieren von hotspot-version für die hotspot-version...Die ursprüngliche Frage nicht zu geben Sie den Typ der Argumente. Dies ist wichtig, weil die definition von max (min) für die floating-point-Argumente ist komplexer. Für floating point (double oder float), die Mathematik.max-Methode wird wahrscheinlich langsamer sein, aber es kann auch ein anderes Ergebnis zurückgeben, wenn eines der Argumente NaN.
Nicht das gleiche. Wenn Sie schreiben
(a > b) ? a : b
Sie nicht haben, eine zusätzliche Funktion aufrufen, so, es wird schneller. Es ist das äquivalent von inlining in C++.Aber das wird keinen Unterschied machen im realen Leben.
Math.max(a,b)
ist mehr lesbar, so dass ich es verwenden würde.