Nogmaals voor mij is het geen discussie Java vs C/C++. Ik haalde C/C++ slechts aan als voorbeeld van een omgeving waarin voorgecompileerde code direct wordt uitgevoerd, vs omgevingen die dynamisch code optimaliseren voor de omgeving (mbv JIT compilers en GC's). Ik had het in mijn eerste reactie ook naast C/C++ over "traditionele compileer processen", "unmanaged code", waarom het verschil aanwezig is in momenten waarop geoptimaliseerd wordt, en waarom dit niet nadelig hoeft te zijn en zelfs imho de toekomst heeft.
Ik zal het er maar op houden dat mijn eerste reactie met iets te veel optimalisaties gelezen werd en er slechts "taal C/C++ is traag" uitkwam oid.

Nog meer tegeltjeswijsheid: premature optimisation is the root of all evil.
@MSAlters:
Een garbage collector voorkomt geen memory fragmentatie. Je beschrijft het gedrag van een memory manager die objecten kan verplaatsen. Dat zat al in Windows 1.0 voor de 8086 (geen grapje!). Alles wat je daar met GlobalAlloc alloceerde kon verschoven worden.
Natuurlijk kan een andere memory manager ook dingen verplaatsen en op die memory fragmentatie
oplossen. Het voordeel dat een garbage collector heeft is dat het meerdere technieken kan gebruiken om te
voorkomen dat memory fragmentatie optreedt. Het principe van generationele gc's bijvoorbeeld maakt gebruik van de kennis die de gc over lifetime van objecten om aparte gebieden te maken voor long-lived en short-lived objecten. Hetzelfde geldt voor localiteit van geheugen. Een gc heeft meer context.
Pardon? Je denkt dat een VM garbage collector beter kan werken dan de typische OS allocator? Goede kans dat de VM niet eens weet hoeveel CPUs er zijn (OK, op x86/Windows is dat meestal wel het geval

) Een OS allocator kan zelfs integreren met het paging algoritme, zoals in Windows NT.
Nogmaals ik zet hier even twee concepten tegenover elkaar, "goede kans zus en zo" is slechts een argument voor de dagelijkse praktijk. In dit geval zal ik je gerust stellen: Java en .NET weten heus wel hoeveel CPU's er zijn, ook op andere platforms dan Wintel. Wie zegt overigens niet dat de JIT compiler/GC uiteindelijk gewoon de OS allocator zou kunnen gebruiken voor een deel van haar taken? Ik zeg alleen dat de JIT meer kan doen met die extra context informatie over zowel omgeving als (nog te executeren) code.
[Wist je dat heel lang mensen geen games schreven in C++ omdat het "te traag" was?]
Dat was .oisyn, maar goed. Ik heb zelfs het verhaal gehoord dat AT&T het niet gebruikte in hun telefooncentrales, terwijl Bjarne toch echt bij Bell Labs werkte? Ook dat was vanwege de snelheid. Dat was in de tijd dat C++ compilers nog niet zo goed waren als vandaag de dag. Een moderne C++ compiler produceert ongeveer even snelle code als een C compiler, en soms sneller (vanwege typesafety en de allocators).
Mijn opmerking was niet bedoeld om te bewijzen dat C++ traag is, maar om aan te geven dat ervaring en volwassenheid van het platform bepalend kan zijn voor de uiteindelijke perceptie van de performance ervan. Je kunt nu al in sommige gevallen zeggen dat de Java JIT compiler ongeveer even snelle code als een C++ compiler produceert, en soms sneller. Er zijn ook benchmarks op internet te vinden die dit laten zien (alhoewel die net zo goed biased zijn als claims van het C++ compiler team lol). Dat beeld zal in de komende jaren steeds verder verschuiven in het voordeel van managed omgevingen, door de inherente voordelen die ik opnoemde. Dat je ook nog eens robuuster, sneller, makkelijker en flexibeler code kunt schrijven is natuurlijk bijzaak in deze performance discussie.

Bell labs is een leuk voorbeeld trouwens: wist je dat BEA zeer sterk aan het oprukken is met real time Java voor telefooncentrales, en dit zelfs als hun nieuwe strategische markt op de afgelopen JavaOne presenteerde?
(>4GB data, >100000 gebruikers, >24 uur runtime, <64KB, dat soort dingen.)
Ik werk nu bij een zorgverzekeraar met Java, datasets van een paar 100 gigabytes, duizenden online gebruikers. Voor een beschikbaarheid meer dan >24uur per dag gaan we niet,

maar we moeten effectief 99.99% kunnen draaien (is overigens veel meer een operationeel probleem dan een technisch probleem). <64kb, heb je eens op je mobiel gekeken waar die domme mobile games in geschreven worden van 40kb?. De getallen die je noemt zijn zaken waar Java zich prima in kan vinden. Dat je het later weer over duurtijd en deployed units hebt: ook hier laten managed omgevingen juist voordelen zien. Ik zou echt niet weten hoe deze getallen argumenten zijn voor een voorgecompileerde applicatie.
De math performance van Java is trouwens echt niet zo dramatisch, de meeste micro-benches geven aan dat er nu al redelijk dicht bij C++ wordt gescoord, en kijk maar eens naar het pioniers werk van BEA met JRockit en real time enterprise Java. Wel frappant hoe je kunt inschatten hoe een totaal onbekend stuk code in VBA te langzaam is en Java 5 minuten moet kosten. Wie weet kan dit stukje code zelfs in VBA al worden herschreven naar iets wat 100 ms duurt, mits het bovengenoemde gezonde verstand wordt gebruikt.
@.oisyn:
Toch heb je het steeds over JIT vs. C/C++. Waarom zou C/C++ niet in een managed omgeving kunnen draaien? Het is natuurlijk niet impliciet dat een C++ app altijd direct naar native code hoeft te compilen. Ik reageerde dan ook puur op Java vs. C++: Java heeft imho te weinig features om ooit de vloer aan te kunnen vegen met C++, of dat nou native of JITed is. En dát was de essentie van mijn post, niet VM vs. native, ook al is de tendens dat Java in een VM draait en C++ naar native machinecode gecompileerd wordt

.
Ik gebruik Java, .NET en C/C++ dus als praktijkvoorbeelden. Zoals ik bovenin al aanhaalde gebruikte ik in mijn eerste post over performance al meer dan één zin om dit toe te lichten, waardoor helaas de onvolledige quote enigszins uit het verband wordt gerukt. Natuurlijk kan C++ ook in een VM draaien, en heeft dan net zo goed de potentie om nog veel sneller te zijn dan voorgecompileerde C++.

En Hobbit: Python en Ruby zijn ook JIT omgevingen, in deze discussie zou je dus ze kunnen scharen onder dezelfde groep als Java/.NET.
Het punt is dat je door Java's reflection model nooit kunt garanderen dat er geen referentie wordt gemaakt naar die member van de class
Dat is dus het mooie van een JIT compiler, die
weet welke code er uitgevoerd gaat worden, en kan dus anders optimaliseren zodra reflection wordt toegepast. Zie bijvoorbeeld de voodoo magic die toegepast wordt voor het gebruik van lokale variabelen in anonieme klasses/delegates. Objecten die normaal op de stack zouden worden gemaakt worden dan ineens op de heap gezet.
Nou praat je echter over een hele tijd terug, de reden dat gamedevelopers C++ schuwen is over het algemeen nooit feitelijk snelheid geweest, maar meer het "langzame" imago dat C++ nog had van vroeger en het feit dat
gamedevelopers over het algemeen verstokte programmeurs zijn die niet snel iets nieuws zullen ontarmen of iets nieuws aan willen leren 
Dat is precies wat ik bedoel: het imago van JIT omgevingen loopt achter op de huidige realiteit. Niet openstaan voor de toekomstige shift en potentie van dit verschil in uitvoeren van code zou ik zeker onverstandig vinden. Ik zal zeker niet zeggen dat Java nu C++ op alle fronten owned en C++ is zeker nu nog de betere keus voor het ontwikkelen van games. Er is zeker een toekomstbeeld waarin dit wel het geval zal zijn (net zoals C++ nu op sommige punten sneller kan zijn dan C, zoals MSAlters aangeeft).
Het schrijven van snelle managed code vereist oefening, ervaring en inzicht: maar wel op punten andere detailkennis dan bijvoorbeeld voorgecompileerde omgevingen. In managed omgevingen zijn allocaties niet altijd evil, en sommige details zijn veel sneller of juist veel trager dan in een unmanaged omgeving. Voor de rest bedoelen we hetzelfde: gezond verstand is de beste performance boost. Als je niet weet wat je doet wordt het altijd traag, of je nu assembler of VBA gebruikt.