2015-12-30 3 views
13

Ich habe eine 1.5-kompatible Java-Quelle, die nur auf 1.8 VM laufen wird und frage mich, ob es nützlich wäre, 1.8 während der Kompilierung anstatt auf eine ältere Version zu setzen.Leistungsunterschied zwischen Quellcode, der auf verschiedene Java-Versionen abzielt?

Würde es einen Leistungsunterschied zwischen 1,5 und 1,8 geben? Gibt es relevante Dokumentation oder Change-Logs, die ich mir ansehen könnte ??

+0

Fragen Sie, ob Java 8-Klassendateien schneller als Java 5-Klassendateien auf einer Java 8-JVM sind oder ob Java 8-Klassendateien auf einer Java 8-JVM schneller sind als Java 5-Klassendateien auf einer Java 5-JVM? – meriton

+0

@meriton der erste – orom

Antwort

3

Die javac tut fast keine Optimierung. Die Hauptoptimierung ist konstant Inlining und das hat es immer getan.

Der Unterschied liegt vollständig in der JVM. In Java 8 haben Sie mehr Möglichkeiten, denselben Code zu schreiben, was bedeutet, dass Sie Code neu schreiben können, um ihn effizienter zu machen.

0

Außer Leistung sollten Sie die tausend Fehlerkorrekturen berücksichtigen, die seit 1,5

behoben wurden Darüber hinaus gibt es neue APIs auf 1,8 wie javafx, NIO, lambas.

Oracle hat angekündigt, dass Swing nicht mehr aktualisiert werden kann. Wenn Ihre Anwendung über eine GUI verfügt, sollten Sie daher nach einer Portierung auf javafx suchen.

in Oracle-Website btw, wenn Sie einen neuen jdk dort herunterladen, ist auch ein Link auf es ist Changelog

+0

Guter Punkt über Fehlerbehebungen, aber ich bin Kuriositäten mehr über Leistungsdifferenz zwischen Bytecode für verschiedene Ziele generiert. Die Anwendung hat keine GUI. – orom

+0

Thre ist ein neuer Garbage Collector effizienter ab Java 1.6. Hotspot wurde auch für x64 neu geschrieben. Andere Informationen sind, denke ich, mehr oracle's interne Geheimnisse und Sie können nur vergleichen, indem Sie einige Tests auf eigene –

7

Da die kompilierten Java-Code, den Sie sich beziehen ist die Byte-Code Java, Ihre alte Anwendung mit einer neuen JVM-Version läuft (1.8) sollte die Leistung Ihrer Anwendung verbessern, ohne dass der Bytecode neu kompiliert werden muss.

Sie können sich die offizielle Oracle-Dokumentation bezüglich JDK 8 performance improvement ansehen, um zu verstehen, was sich geändert hat.

+2

tun, aber würde der Bytecode, der für neuere Ziele erzeugt wird, irgendwelche "besseren" sein? Ich habe ein paar Klassen dekompiliert und es gibt definitiv einen Unterschied zwischen dem Bytecode beim 1.5 und 1.8. Ich habe die JDK Chnagelogs angeschaut, aber hoppe dort würde eine zusammengefasste Version irgendwo für leistungsbezogene Änderungen in Java, wenn solche existiert. – orom

+1

Es sollte keinen großen Unterschied machen, es könnte einen möglichen Unterschied geben, aber nicht so viel, vielleicht sogar nicht bemerkbar. Anders wäre es, wenn Sie den Code ändern würden, um die Vorteile der neuen optimierten Datenstruktur zu nutzen, etc ... – aleroot

+0

Es könnte in Zukunft auf einige kleine Arten, aber nicht viele. Zum Beispiel wird erwartet, dass Java 9 die Art und Weise ändert, wie Zeichenkettenverkettungen kompiliert werden, um invokedynamic zu verwenden, was nur verfügbar ist, wenn Java 7 und höher als Ziel verwendet wird. –

1

Normalerweise setze ich die Kompilierung auf 1.7. Die neue Lambda-Syntax neben anderen Funktionen von Java 8 ist gut zu haben, aber ich habe mit Java 7 weit weniger Kompatibilitätsprobleme, und das ist es, was ich gewohnt bin.

Wenn Sie die VM verwenden, um in sich selbst zu arbeiten, und Sie wissen, dass Sie nicht auf Frameworks verlassen haben, die mit Problemen enden, auf jeden Fall mit Java 8 beginnen. Sie können auch die offizielle Dokumentation, aber Wikipedia bietet tatsächlich eine schöne Änderungsprotokoll imo: https://en.wikipedia.org/wiki/Java_version_history

1

Ich fand this Oracle source, die die Kompatibilität von Java 7 mit früheren Versionen behandelt. Es erwähnt nur den Bytecode invokedynamic als eine (Bytecode) -Differenz zwischen Version 7 und 6. Da sich der Bytecode nicht wirklich stark ändert, sind die Auswirkungen von Bytecode der Version 5 gegenüber Version 8 auf Leistung vernachlässigbar.

+1

Die "aufgerufene Dynamik" war (IIRC) die einzige * echte * (oder zumindest: die einzige signifikante) Änderung am Bytecode seit Einführung der JVM, also ist es definitiv erwähnenswert. Aber ich bin nicht sicher, was die Auswirkungen auf die Leistung sind. Du hast erwähnt, dass sie "vernachlässigbar" sind, aber ... wo werden Leistungsunterschiede * überhaupt sein, und wie groß werden sie sein? – Marco13

+1

Laut [this] (http://www.javaworld.com/article/2860079/scripting-jvm-languages/invokedynamic-101.html) war der Grund für 'invokedynamic' tatsächlich die Performance. Nur keine Java-Performance, sondern andere dynamische Sprachen, die auf der JVM laufen. – Kayaman

Verwandte Themen