Я много раз видел различные тесты, которые показывают, как группа языков выполняет задание.
Эти тесты всегда показывают, что Python медленнее, чем Java, и быстрее, чем PHP, и мне интересно, почему это так.
- Java, Python и PHP работают внутри виртуальной машины
- Все три языка преобразуют свои программы в свои собственные байтовые коды, которые запускаются поверх операционной системы, поэтому ни один из них не работает изначально
- И Java, и Python могут быть «скомпилированы» (
.pyc
для Python), но__main__
модуль для Python не скомпилирован
Python и PHP динамически типизированы, а Java статически - вот почему Java работает быстрее, и если да, пожалуйста, объясните, как это влияет на скорость.
И, даже если аргумент dynamic-vs-static верен, это не объясняет, почему PHP медленнее, чем Python - потому что оба являются динамическими языками.
java
php
python
language-design
treecoder
источник
источник
Ответы:
Код JVM может быть эффективно скомпилирован с использованием JIT с использованием тривиального (и быстрого) специального компилятора. Но то же самое было бы исключительно сложно для PHP и Python из-за их динамически типизированной природы. JVM преобразуется в довольно простой и понятный нативный код, очень похожий на то, что создавал бы компилятор C ++, но для динамических языков вам пришлось бы генерировать динамическую диспетчеризацию буквально для всех основных операций и для всех вызовов методов. Эта динамическая отправка является основным узким местом для всех языков такого рода.
В некоторых случаях можно устранить динамическую диспетчеризацию (а также виртуальные вызовы в Java) с помощью гораздо более сложного компилятора трассировки JIT. Этот подход все еще находится в зачаточном состоянии, не делая слишком много абстрактной интерпретации, и такой компилятор, вероятно, душит
eval
вызовы (которые очень типичны для динамических языков).Что касается разницы между Python и PHP, то последний имеет гораздо более низкое качество. Теоретически он может работать быстрее, но никогда не будет.
источник
eval
вызов.Есть общая проблема с этим вопросом в том, что он слишком абсолютен. Не имеет смысла говорить «язык X быстрее, чем язык Y». Компьютерный язык сам по себе не является «быстрым» или «медленным», потому что это всего лишь способ выражения алгоритма. Фактический вопрос должен быть примерно таким: «Почему реализация X1 языка X быстрее, чем реализация Y1 языка Y для этой конкретной проблемной области?»
Некоторые различия в скорости, безусловно, будут выпадать из самого языка, поскольку некоторые языки легче реализовать в одних доменах, чем в других. Но многое из того, что делает реализацию быстрой, - это не язык. Например, вы не можете сказать «Python медленнее, чем Java», не задумываясь о том, говорите ли вы о CPython, IronPython или PyPy. Это особенно верно для языков, которые используют виртуальную машину, поскольку скорость будет напрямую зависеть от качества виртуальной машины.
Кроме того, я работаю с системой, которая по разным причинам не может использовать JIT на нашем устройстве с очень популярной виртуальной машиной JavaScript, которая обычно поддерживает ее. Это означает, что наш JavaScript работает намного медленнее, чем на ПК с аналогичным процессором. Это одно изменение, которое напрямую не связано с самим языком, превращает JavaScript из «в несколько раз медленнее, чем С ++» в «на несколько порядков медленнее, чем С ++», для задач, которые нас интересуют.
Также следует учитывать, что языки отличаются по характеристикам производительности способами, которые не могут быть напрямую сопоставлены. Слишком много тестов просто переводят программу с языка A на язык B и не учитывают, что языки отличаются быстродействием. (Вы можете увидеть это в любом разумном сравнительном тесте, таком как те, на которые вы ссылаетесь, поскольку они часто имеют примечания типа «спасибо тем-то за то, что показали мне, как реализовать это на языке Foo».)
Например, возьмите этот код Java:
Было бы заманчиво «переписать» это в C ++ и сравнить время выполнения:
Дело в том, что любой компетентный программист C ++ сразу увидит, что в C ++ это не самый быстрый способ что-то сделать. Вы можете легко ускорить процесс, изменив его на более подходящий для C ++:
Дело не в том, что 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 ++ быстрее в тех случаях, когда вы можете оценить выражение во время сборки, используя шаблоны». Менее удовлетворительно, но верно.
Различия в скорости в языках в основном связаны с реализацией. Скомпилированные языки будут работать быстрее, чем интерпретируемые. Компиляция в нативный код будет быстрее, чем в байт-код. Это будет иметь гораздо больший эффект, чем такие вопросы, как статический тип языка или нет. И, конечно, хорошие реализации будут быстрее, чем плохие.
И не забывайте, что хорошие программисты будут создавать более быстрый код, чем плохие программисты, часто в такой степени, которая перевешивает языковые различия.
источник
Это связано с качеством компилятора, компилятор java постоянно оптимизируется гораздо дольше, а оптимизация важнее, потому что весь код скомпилирован для Java. Я не уверен, что точная причина для Python быть быстрее, чем PHP, но я бы поспорил из-за влияния Google с Python.
источник
Почему Java самая быстрая:
Статически типизированный + JIT compile + --server флаг для агрессивной перекомпиляции исполняемого кода.
Почему Python быстрее чем PHP:
Python может быть динамическим языком, но он все еще строго типизирован. Это означает, что структуры, которые вы кодируете, способны к оптимизации во время выполнения.
Почему PHP отстой:
Это в основном javascript на сервере (без поддержки многопоточности, полностью динамический, свободно типизированный).
По сути, чем больше компилятор знает о вашем коде, тем больше он может оптимизировать. Java полностью оптимизируется перед запуском и во время работы. Python оптимизируем во время работы, а PHP ужасен. Facebook фактически передает их PHP на C, прежде чем он попадет на сервер.
https://developers.facebook.com/blog/post/2010/02/02/hiphop-for-php--move-fast/
источник
Тесты довольно искажены в пользу тяжелого математического программирования.
Неудивительно, что Python довольно хорош в сложной математике, если учесть, где и почему он был впервые написан .
PHP, с другой стороны, был написан для обслуживания веб-страниц, он может делать другие вещи, но веб-страницы - это то, что лучше всего, и наравне или лучше, чем Java в этой задаче.
источник