Есть две основные причины, по которым Java быстрее, чем Go и C ++, и во многих случаях может быть быстрее, чем C:
1) Компилятор JIT. Он может встроить вызовы виртуальных функций на нескольких уровнях, даже с объектно-ориентированными классами, на основе профиля времени выполнения. Это невозможно в статически компилируемом языке (хотя может помочь более новая перекомпиляция на основе записанного профиля). Это очень важно для большинства тестов, в которых используются повторяющиеся алгоритмы.
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 выходит на первое место с комбинированным использованием памяти и настенное время.