Es gibt zwei grundlegende Gründe, warum Java schneller als Go und C ++ ist und in vielen Fällen schneller als C sein kann:
1) Der JIT-Compiler. Es kann virtuelle Funktionsaufrufe über mehrere Ebenen hinweg einbinden, auch mit OO-Klassen, basierend auf dem Laufzeitprofil. Dies ist in einer statisch kompilierten Sprache nicht möglich (obwohl die neuere Neukompilierung basierend auf dem aufgezeichneten Profil hilfreich sein kann). Dies ist für die meisten Benchmarks mit sich wiederholenden Algorithmen sehr wichtig.
2) Der GC. Die GC-basierte Speicherzuweisung ist im Vergleich zu malloc nahezu kostenlos. Und die "kostenlose" Strafe kann über die gesamte Laufzeit abgeschrieben werden - oft übersprungen, weil das Programm beendet wird, bevor der gesamte Müll gesammelt werden muss.
Es gibt Hunderte (Tausende?) Von äußerst talentierten Entwicklern, die die GC / JVM effizient machen. Zu denken, man könne "besser codieren als alle", ist eine Torheit. Es ist ein menschliches Ego-Problem im Herzen - Menschen haben es schwer zu akzeptieren, dass der Computer mit der richtigen Ausbildung durch talentierte Menschen eine bessere Leistung erbringen wird als die Menschen, die ihn programmiert haben.
Übrigens kann C ++ so schnell wie C sein, wenn Sie die OO-Funktionen nicht verwenden, aber dann sind Sie ziemlich nah dran, zunächst nur in C zu programmieren.
Am wichtigsten ist, dass die "Geschwindigkeitsunterschiede" in diesen Tests normalerweise bedeutungslos sind. Die E / A-Kosten sind um Größenordnungen höher als die Leistungsunterschiede. Daher gewinnen richtige Designs, die die E / A-Kosten minimieren, immer - auch in einer interpretierten Sprache. Sehr wenige Systeme sind CPU-gebunden.
Abschließend wird das "Computersprachen-Benchmark-Spiel" als "wissenschaftliche Maßnahme" bezeichnet. Die Tests sind vollständig fehlerhaft. Wenn Sie beispielsweise die Java-Tests für nbody anzeigen. Wenn ich die Tests auf demselben Betriebssystem / derselben Hardware ausführe, erhalte ich ungefähr 7,6 Sekunden für Java und 4,7 Sekunden für C - was vernünftig ist - nicht die 4-fache Langsamkeit, die die Tests melden. Es handelt sich um Klick-Köder, gefälschte Nachrichten, die dazu dienen, Site-Traffic zu generieren.
Als letzte, letzte Anmerkung ... Ich habe die Tests mit Go durchgeführt und es waren 7,9 Sekunden. Die Tatsache, dass wenn Sie auf Los klicken, es mit Java verglichen wird und wenn Sie auf Java klicken, wird es mit C verglichen, sollte für jeden ernsthaften Ingenieur eine rote Fahne sein.
Für einen echten Weltvergleich von Java, Go, und C ++ siehe https://www.biorxiv.org/content/10.1101/558056v1 spoiler alert, kommt Java an die Spitze in rohen Leistung, mit Go kommt an die Spitze mit kombinierten Speichernutzung und Wandzeit.