Java is een programmeertaal, daardoor wordt iets niet sneller of langzamer dan wanneer je een andere programmeertaal zou gebruiken.
Onwaar. De paradigma's van de taal bepalen heel erg of dingen snel of langzaam kúnnen zijn.
Javascript is ook een programmeertaal, maar de aard van de taal maakt het dat statische analyse heel lastig is en er dus heel veel tijdens runtime geevalueerd moet worden. Zo is een object in Java slechts een hash table. Op willekeurige momenten kunnen er properties worden toegevoegd, en dat kan op basis van runtime string waarden. En een statisch getypeerde taal als Java en C++ liggen de blauwdrukken van de objecten vast. Er is van tevoren bekend welke properties ze hebben, wat voor type ze zijn, en heel belangrijk: op welke offset ze in het geheugen staan relatief aan het begin van het object. Uiteindelijk is twee integers bij elkaar optellen vanuit bepaalde offsets in het geheugen een stuk sneller dan een hash lookup doen op basis van strings, en dan ook nog eens bepalen van welk type die objecten zijn. En dat zijn dus typisch dingen waar loose typed scripttalen als PHP en Javascript heel veel last van hebben. Natuurlijk staan ontwikkelingen niet slim en zijn de interpreters vaak steeds beter in staat om uitvoerende statische analyse op de code te doen, maar het blijft behelpen.
De verschillen tussen Java en C++ zijn kleiner, maar ze zijn er weldegelijk. Zo zijn instances van classes altijd referenties naar geheugenadressen. Je kunt nooit een class instance direct op de stack aanmaken of in een global. Nou is een goede JVM wel enigszins in staat om voor kleine short-lived objecten (zoals bijvoorbeeld een 3D vector, wat een typische value-class zou zijn) bepaalde optimalisaties te maken, maar in C++ heb je hier gewoon zelf de controle over. C# is daar overigens wat beter in, want die kent value-type classes in de vorm van "structs". Maar hoe dan ook, references zorgen voor extra indirectie, meer cache misses en pipeline stalls.
Een ander belangrijk punt is dat je in C++ doorgaans toegang hebt tot de daadwerkelijke instructieset van de onderliggende architectuur middels intrinsics. Computation-heavy code kun je direct middels SSE implementeren. Java kent dat soort primitieven niet. Er wordt wel gewerkt aan auto-vectorizing code, maar de resultaten zijn er nog niet naar dat het enigszins mee kan komen met zelf ingetypte SSE code.
Het grote voordeel van JIT is vooral dat het kan aanpassen aan toekomstige platformen. De realiteit is echter dat het target platform zelden zo essentieel veranderd dat je hier veel voordeel uit kunt halen. De meest recente verandering is wellicht de komst van AVX, oftewel bredere SSE registers waardoor je nu 8 floats en in de toekomst zelfs 16 floats in een enkel register kwijt kunt en dus tegelijk kunt behandelen. Een C++ gecompileerd voor SSE zal hier dus niet automatisch gebruik van kunnen maken. Iemand zal de nodige aanpassingen moeten maken en een nieuwe executable moeten compilen. Maar zoals gezegd, zo vaak komen die situaties niet voor.