Є дві основні причини того, що Java швидша за Go і C ++, а в багатьох випадках може бути швидшою за C:
1) Компілятор JIT. Він може вбудовувати виклики віртуальних функцій через декілька рівнів, навіть із класами OO, на основі профілю виконання. Це неможливо статично складеною мовою (хоча новіша перекомпіляція на основі записаного профілю може допомогти). Це дуже важливо для більшості орієнтирів, які передбачають повторювані алгоритми.
2) ГК. Розподіл пам'яті на основі GC майже безкоштовний порівняно з malloc. А "вільне" покарання може бути амортизовано протягом усього часу виконання - часто пропускається, оскільки програма припиняється до того, як потрібно зібрати весь сміття.
Є сотні (тисяч?) Надзвичайно талановитих розробників, які роблять GC / JVM ефективними. Думати, що ти можеш "кодувати краще всіх", - це дурість. Це суть людського егоїзму - люди важко сприймають, що при належному навчанні талановитих людей комп'ютер буде працювати краще, ніж люди, які його запрограмували.
Btw, C ++ може бути настільки ж швидким, як і C, якщо ви не використовуєте і функцій OO, але тоді ви досить близькі до просто програмування на C для початку.
Найголовніше, що "різниці швидкостей" у цих тестах зазвичай безглузді. Витрати на IO на порядок більше, ніж різниці в продуктивності, і тому правильні конструкції, що мінімізують витрати на виведення, завжди виграють - навіть в інтерпретованій мові. Дуже мало систем пов'язано з процесором.
Як остаточне зауваження, люди називають "гру комп'ютерних мовних орієнтирів" як "наукову міру". Тести є повністю помилковими, наприклад, якщо ви переглядаєте тести 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 виходить на перше місце при комбінованому використанні пам'яті і настінний час.