Есть общая проблема с этим вопросом в том, что он слишком абсолютен. Не имеет смысла говорить «язык X быстрее, чем язык Y». Компьютерный язык сам по себе не является «быстрым» или «медленным», потому что это всего лишь способ выражения алгоритма. Фактический вопрос должен быть примерно таким: «Почему реализация X1 языка X быстрее, чем реализация Y1 языка Y для этой конкретной проблемной области?»
Некоторые различия в скорости, безусловно, будут выпадать из самого языка, поскольку некоторые языки легче реализовать в одних доменах, чем в других. Но многое из того, что делает реализацию быстрой, - это не язык. Например, вы не можете сказать «Python медленнее, чем Java», не задумываясь о том, говорите ли вы о CPython, IronPython или PyPy. Это особенно верно для языков, которые используют виртуальную машину, поскольку скорость будет напрямую зависеть от качества виртуальной машины.
Кроме того, я работаю с системой, которая по разным причинам не может использовать JIT на нашем устройстве с очень популярной виртуальной машиной JavaScript, которая обычно поддерживает ее. Это означает, что наш JavaScript работает намного медленнее, чем на ПК с аналогичным процессором. Это одно изменение, которое напрямую не связано с самим языком, превращает JavaScript из «в несколько раз медленнее, чем С ++» в «на несколько порядков медленнее, чем С ++», для задач, которые нас интересуют.
Также следует учитывать, что языки отличаются по характеристикам производительности способами, которые не могут быть напрямую сопоставлены. Слишком много тестов просто переводят программу с языка A на язык B и не учитывают, что языки отличаются быстродействием. (Вы можете увидеть это в любом разумном сравнительном тесте, таком как те, на которые вы ссылаетесь, поскольку они часто имеют примечания типа «спасибо тем-то за то, что показали мне, как реализовать это на языке Foo».)
Например, возьмите этот код Java:
for(int i=0;i<10;i++) {
Object o = new Object;
doSomething(o);
}
Было бы заманчиво «переписать» это в C ++ и сравнить время выполнения:
for(int i=0;i<10;i++) {
Object *o = new Object;
doSomething(o);
delete(o);
}
Дело в том, что любой компетентный программист C ++ сразу увидит, что в C ++ это не самый быстрый способ что-то сделать. Вы можете легко ускорить процесс, изменив его на более подходящий для C ++:
for(int i=0;i<10;i++) {
Object o;
doSomething(&o);
}
Дело не в том, что C ++ может быть быстрым, а в том, что написание тестов для сравнения языков действительно очень сложно. Чтобы сделать это соответствующим образом, вы должны быть экспертом в обоих языках и писать с нуля на обоих языках. Даже тогда вы можете легко столкнуться с областями, в которых один язык превосходит определенную задачу. Например, я могу написать версию Towers of Hanoi на C ++, которая будет работать быстрее, чем Java на любом приемлемом компиляторе. Я могу сделать это путем читерства, используя шаблоны C ++, оцененные во время компиляции (http://forums.devshed.com/c-programming-42/c-towers-of-hanoi-using-templates-424148.html)
Дело не в том, что я мог бы сказать, что «C ++ быстрее, чем Java», потому что моя программа возвратилась мгновенно, в то время как версия Java работала в течение нескольких минут (и надеялась, что никто не заметил, что моя программа собиралась за полчаса). Дело в том, что для этого В узком случае C ++ быстрее. Для других узких случаев это может быть наоборот. Таким образом, это не «C ++ быстрее», а «C ++ быстрее в тех случаях, когда вы можете оценить выражение во время сборки, используя шаблоны». Менее удовлетворительно, но верно.
Различия в скорости в языках в основном связаны с реализацией. Скомпилированные языки будут работать быстрее, чем интерпретируемые. Компиляция в нативный код будет быстрее, чем в байт-код. Это будет иметь гораздо больший эффект, чем такие вопросы, как статический тип языка или нет. И, конечно, хорошие реализации будут быстрее, чем плохие.
И не забывайте, что хорошие программисты будут создавать более быстрый код, чем плохие программисты, часто в такой степени, которая перевешивает языковые различия.