Существует две основные причины того, что Java быстрее, чем Go и C ++, и во многих случаях может быть быстрее, чем C:
1) JIT-компилятор. Он может встроить вызовы виртуальных функций на нескольких уровнях, даже с классами OO, в зависимости от профиля времени выполнения. Это невозможно на статически скомпилированном языке (хотя может помочь новая перекомпиляция, основанная на записанном профиле). Это очень важно для большинства тестов, в которых используются повторяющиеся алгоритмы.
2) ГК. Распределение памяти на основе GC практически свободно по сравнению с malloc. А штраф «бесплатно» может амортизироваться в течение всего времени выполнения - часто пропускается, потому что программа завершает работу до того, как должен быть собран весь мусор.
Существуют сотни (тысячи?) Чрезвычайно талантливых разработчиков, делающих GC / JVM эффективной. Думать, что ты можешь «кодировать лучше всех» - глупость. В глубине души это проблема человеческого эго - людям трудно смириться с тем, что при надлежащем обучении талантливых людей компьютер будет работать лучше, чем люди, которые его запрограммировали.
Кстати, C ++ может работать так же быстро, как C, если вы не используете и функции OO, но тогда вы довольно близки к программированию на C для начала.
Самое главное, что «различия в скорости» в этих тестах обычно не имеют смысла. Затраты на ввод-вывод на несколько порядков превышают различия в производительности, и поэтому правильные конструкции, которые минимизируют затраты на ввод-вывод, всегда выигрывают - даже на интерпретируемом языке. Очень немногие системы связаны с процессором.
В качестве заключительного замечания люди называют «игру в компьютерные языковые тесты» «научной мерой». Тесты полностью ошибочны, например, если вы просматриваете тесты Java для nbody. Когда я запускаю тесты на одной и той же ОС / оборудовании, я получаю примерно 7,6 секунды для Java и 4,7 секунды для C - что вполне разумно - не в 4 раза медленнее, чем в отчетах о тестах. Это клик-приманка, фальшивые новости, предназначенные для генерации трафика сайта.
В качестве заключительного, заключительного замечания ... Я выполнил тесты, используя Go, и это было 7,9 секунды. Тот факт, что когда вы нажимаете Go, он сравнивает его с Java, а когда вы нажимаете Java, он сравнивает его с C, должен быть красным флагом для любого серьезного инженера.
Для реального сравнения Java, Go и C ++ см. https://www.biorxiv.org/content/10.1101/558056v1 Оповещение о спойлерах: Java занимает первое место по сырой производительности, а Go выходит на первое место с комбинированным использованием памяти и временем работы.