Um mal auf das ursprüngliche Thema zurückzukommen:
Ich dachte bisher immer, dass C++ das non-plus-ultra ist in Sachen Performance.
Es gab mal eine Zeit, da war das zutreffend: Da war Java noch relativ neu (=unausgereift), und in C++ (bzw. den ) steckten schon zehn Jahre Entwicklungsarbeit. Wenn man von C ausgeht sogar gute 25 Jahre. Inzwischen hat sich da aber sehr viel getan.
Auch die Vorraussetzungen waren andere: Wieviel RAM hatte ein Rechner Ende der 90er nochmal? Ich glaub 128MB war schon viel...wenn nicht sogar das obere Ende. Das Windows damals ist wegen jeder Scheiße abgestürzt...und wenn der Programmierer so richtig Mist gebaut hat, durfte der Benutzer Windows komplett neu installieren. Und erinnert sich noch jemand daran, wie ein Rechner bereits ausgelastet war wenn er einfach nur Musik abspielen sollte?
Ich habe, das muß so 2007 gewesen sein, eine Kiste auf dem Hardwarestand von Ende der 90er aufgesetzt, Windows XP installiert, und WinAmp drauf laufen lassen - ein einfacher Musikplayer, und die Auslastung im Taskmanager lag bei 30%.
Es stimmt schon: Mit der JVM läuft erstmal ein ordentlicher Ballast mit - totaler Wahnsinn für ein Hello World. Während bei einem statisch kompiliertem Programm nach er Kompilierzeit genau festgelegt ist, was es wann und wie macht, hat die JVM und der JIT-Compiler noch während der Laufzeit Möglichkeiten zur Optimierung.
Während ein C/C++-Programm beliebig oft denselben String in den Speicher schmeißen kann (ich denke da an sowas wie das Verarbeiten großer CSV- oder XML-Dateien), kann die JVM da viel prüfen und komprimieren.
Da laufen dann prinzipiell schon mehrere Threads parallel während es bei C/C++ nur ein einziger ist - dafür sinkt bei diesem Beispiel die RAM-Auslastung.
Und da sind wir auch schon bei der Frage: Was heißt "non-plus-ultra ist in Sachen Performance" denn genau? Schnelle Verarbeitung? Wenig RAM-Auslastung? Oft kann man das eine erreichen in dem man das andere aufgibt. Während das statisch kompilierte Programm da festgelegt ist, kann die JVM das zu jedem Zeitpunkt anders festlegen (ob die jeweilige Implementierung das tut ist natürlich eine andere Frage, aber zumindest existiert die Möglichkeit theoretisch).
Und dann ist statisch kompiliert ja auch nicht gleich kompiliert...das Kompilat variiert ja auch mit der Compilerimplementierung, Compilereinstellungen, der verwendeten Architektur, Mondphase und ob der Programmierer vorher Pizza mit oder ohne Käserand verspeist hat.
Du siehst: Das einzige, was du weitgehend sicher sagen kannst, ist, das Pauschaliesierungen meistens falsch sind.