Die Annahme das Bytecode generell langsamer ist als native übersetzter Code ist falsch! Es gibt viele Optimierungen die eine VM machen kann die ein Compiler nicht kann. Ein Beispiel ist die Vererbung von Methoden und das inlining. Der Compiler kann überhaupt nicht wissen welche Klasse letztendlich benutzt wird. Eine Java VM entscheidet zur Laufzeit ob eine Methode "inlined" wird oder nicht. Bei größeren Vererbungshirarchien spart das so manchen Funktionsaufruf. Es gibt einige Compiler die für bestimmte Szenarios den Code optimieren. Dazu analysieren sie das Laufzeitverhalten bei "Probeläufen". Für dieses Szenario wird dann der Code optimiert. Für andere Szenarien kann das dann fürchterlich in die Hose gehen. Eine VM kann das dynamisch, sie passt sich zur Laufzeit an die Daten an.
Es gibt einige Compiler die für bestimmte Szenarios den Code optimieren. Dazu analysieren sie das Laufzeitverhalten bei "Probeläufen". Für dieses Szenario wird dann der Code optimiert. Für andere Szenarien kann das dann fürchterlich in die Hose gehen. Eine VM kann das dynamisch, sie passt sich zur Laufzeit an die Daten an.