Frage

Ich spiele herum ein Spielzeugdolmetscher in Java und ich habe darüber nachgedacht, einen einfachen Compiler zu schreiben, der Bytecode für die Java Virtual Machine generieren kann.Was mich zum Nachdenken brachte: Wie viel Optimierung muss von Compilern vorgenommen werden, die auf virtuelle Maschinen wie JVM und CLI abzielen?

Führen Just-In-Time-Compiler (JIT) ständige Faltungen, Gucklochoptimierungen usw. durch?

War es hilfreich?

Lösung

Ich werde nur zwei Links hinzufügen, die es erklären Javas Bytecode ziemlich gut und einige davon verschiedene Optimierungen der JVM zur Laufzeit.

Andere Tipps

Die Optimierung des Bytecodes ist in den meisten Fällen wahrscheinlich ein Widerspruch in sich

Ich glaube nicht, dass das stimmt.Optimierungen wie das Hochziehen von Schleifeninvarianten und das Propagieren von Konstanten können niemals schaden, selbst wenn die JVM intelligent genug ist, sie selbst durchzuführen, und zwar einfach dadurch, dass der Code weniger Arbeit leistet.

Optimierung macht JVMs als Umgebungen für Anwendungen mit langer Laufzeit brauchbar. Sie können darauf wetten, dass SUN, IBM und ihre Freunde ihr Bestes tun, um sicherzustellen, dass sie Ihren Bytecode und JIT-kompilierten Code so effizient wie möglich optimieren können.

Wenn Sie jedoch glauben, dass Sie Ihren Bytecode vorab optimieren können, wird dies wahrscheinlich keinen großen Schaden anrichten.

Man sollte sich jedoch darüber im Klaren sein, dass JVMs tendenziell eine bessere Leistung erbringen (und nicht abstürzen), wenn ihnen genau die Art von Bytecode präsentiert wird, die der Java-Compiler normalerweise erstellt.Es ist nicht ungewöhnlich, dass Optimierungen übersehen werden oder sogar die JVM abstürzt, wenn Permutationen des Bytecodes auftreten, die korrekt sind, sich aber von denen unterscheiden, die von javac erzeugt würden.Hoffentlich gehört so etwas mittlerweile der Vergangenheit an, aber vielleicht ist es etwas, worüber man sich im Klaren sein sollte.

Verschleierer wie ProGuard führen für Sie viele statische Optimierungen an Ihrem Bytecode durch.

Der HotSpot-Compiler optimiert Ihren Code zur Laufzeit besser, als dies zur Kompilierungszeit möglich ist – schließlich verfügt er über mehr Informationen, mit denen er arbeiten kann.Sie sollten nur dann den Bytecode und nicht nur Ihren Algorithmus optimieren, wenn Sie auf mobile Geräte wie den Blackberry abzielen, bei denen die JVM für diese Plattform nicht leistungsstark genug ist, um den Code zur Laufzeit zu optimieren, und nur den Bytecode ausführt.

Die Optimierung des Bytecodes ist in den meisten Fällen wahrscheinlich ein Widerspruch in sich.Sofern Sie die VM nicht kontrollieren, haben Sie keine Ahnung, was sie tut, um die Codeausführung zu beschleunigen, wenn überhaupt.Der Compiler müsste die Details der VM kennen, um optimierten Code zu generieren.

Hinweis an Aseraphim:

In einigen begrenzten Fällen kann es auch nützlich sein, den Bytecode für nicht eingebettete Anwendungen zu optimieren:

  1. Bei der Übermittlung von Code über das Kabel, z. B. für WebStart-Apps, um die Liefer-/Cachegröße zu minimieren und weil Sie nicht unbedingt die Leistungsfähigkeit/Geschwindigkeit des Clients kennen.

  2. Für Code, von dem Sie wissen, dass er leistungskritisch ist und beim Start verwendet wird, bevor (sagen wir) HotSpot Zeit hatte, Statistiken zu sammeln.

Auch hier können die Transformationen, die ein guter Optimierer/Verschleierer durchführt, sehr hilfreich sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top