Il y a deux raisons fondamentales pour lesquelles Java est plus rapide que Go et C ++, et peut être plus rapide que C dans de nombreux cas:
1) Le compilateur JIT. Il peut intégrer des appels de fonctions virtuelles via plusieurs niveaux, même avec des classes OO, en fonction du profil d'exécution. Cela n'est pas possible dans un langage compilé statiquement (bien que la recompilation plus récente basée sur le profil enregistré puisse aider). Ceci est très important pour la plupart des benchmarks qui impliquent des algorithmes répétitifs.
2) Le GC. L'allocation de mémoire basée sur GC est presque gratuite, par rapport à malloc. Et la pénalité «gratuite» peut être amortie sur tout le temps d'exécution - souvent ignorée car le programme se termine avant que tous les déchets ne doivent être collectés.
Il existe des centaines (des milliers?) De développeurs extrêmement talentueux qui rendent le GC / JVM efficace. Penser que vous pouvez «coder mieux que tous» est une folie. C'est un problème d'ego humain en son cœur - les humains ont du mal à accepter qu'avec un entraînement approprié par des humains talentueux, l'ordinateur va mieux fonctionner que les humains qui l'ont programmé.
Btw, C ++ peut être aussi rapide que C si vous n'utilisez pas et des fonctionnalités OO, mais alors vous êtes assez proche de simplement programmer en C pour commencer.
Plus important encore, les «différences de vitesse» dans ces tests n'ont généralement aucun sens. Les coûts d'E / S sont des ordres de grandeur supérieurs aux différences de performances, et les conceptions appropriées qui minimisent les coûts d'E / S gagnent toujours, même dans un langage interprété. Très peu de systèmes sont liés au processeur.
En guise de note finale, les gens se réfèrent au «jeu des repères de langage informatique» comme une «mesure scientifique». Les tests sont complètement défectueux, par exemple, si vous affichez les tests Java pour nbody. Lorsque j'exécute les tests sur le même système d'exploitation / matériel, j'obtiens environ 7,6 secondes pour Java et 4,7 secondes pour C - ce qui est raisonnable - pas la lenteur 4x des rapports de tests. Il s'agit d'appât au clic, de fausses nouvelles, conçues pour générer du trafic sur le site.
En guise de note finale, j'ai fait les tests en utilisant Go, et c'était 7,9 secondes. Le fait que lorsque vous cliquez sur Go, il le compare à Java, et lorsque vous cliquez sur Java, il le compare à C, devrait être un signal d'alarme pour tout ingénieur sérieux.
Pour une comparaison du monde réel de Java, Go et C ++, voir https://www.biorxiv.org/content/10.1101/558056v1 alerte spoiler, Java arrive en tête des performances brutes, avec Go en tête avec l'utilisation combinée de la mémoire et l'heure du mur.