Warum Code ist ein 14x langsamer als Code-Schnipsel B-Snippet?
(getestet mit jdk1.8.0_60 auf Windows 7 64-Bit)Warum ist static final langsamer als eine neue auf jeder Iteration
Code-Snippet A:
import java.awt.geom.RoundRectangle2D;
public class Test {
private static final RoundRectangle2D.Double RECTANGLE = new RoundRectangle2D.Double(1, 2, 3, 4, 5, 6);
public static void main(String[] args) {
int result = RECTANGLE.hashCode();
long start = System.nanoTime();
for (int i = 0; i < 100_000_000; i++) {
result += RECTANGLE.hashCode(); // <= Only change is on this line
}
System.out.println((System.nanoTime() - start)/1_000_000);
System.out.println(result);
}
}
-Code-Schnipsel B:
import java.awt.geom.RoundRectangle2D;
public class Test {
private static final RoundRectangle2D.Double RECTANGLE = new RoundRectangle2D.Double(1, 2, 3, 4, 5, 6);
public static void main(String[] args) {
int result = RECTANGLE.hashCode();
long start = System.nanoTime();
for (int i = 0; i < 100_000_000; i++) {
result += new RoundRectangle2D.Double(1, 2, 3, 4, 5, 6).hashCode();
}
System.out.println((System.nanoTime() - start)/1_000_000);
System.out.println(result);
}
}
TL; DR: die Verwendung von new
Schlüsselwort innerhalb einer Schleife ist schneller als ein static final
Feld zugreifen.
(Anmerkung: Das Entfernen der final
Schlüsselwort auf RECTANGLE
nicht die Ausführungszeit ändern)
Ihre Tests berücksichtigen nicht die JVM Aufwärmzeit/Startzeit. Ihre Ergebnisse werden wahrscheinlich inkonsistent wie geschrieben sein. Sie testen wirklich, wie schnell die JVM startet und führt dann Ihren Code aus. – SnakeDoc
@SnakeDoc, JVM Warm-up/Start ist sicherlich eine Überlegung, aber es erklärt nicht den Leistungsunterschied, den ich für die Codes des OP sehe. Selbst nach dem Einführen einer Aufwärmschleife in die langsamere, kommt die (verbesserte) Leistung nicht annähernd schneller voran. –
nein, ich versuchte, dies von Fall zu laufen A dann Fall B innerhalb einer Anwendung und dann die Reihenfolge umgekehrt wird, eine in beiden Fällen war Fall A 21x länger –