Что делает PHP медленнее, чем Java или C #? - PullRequest
26 голосов
/ 11 сентября 2009

Это то, что я всегда задавался вопросом: почему PHP медленнее, чем Java или C #, если все 3 из этих языков компилируются в байт-код и затем выполняются оттуда? Я знаю, что обычно PHP перекомпилирует каждый файл с каждым запросом, но даже когда вы добавляете APC (кэш байт-кода) в изображение, производительность не приближается к производительности Java или C # (хотя APC значительно улучшает ее).

Edit: Я даже не говорю об этих языках на веб-уровне. Я говорю о сравнении их, когда они хрустят. Даже не включая время запуска или что-то в этом роде.

Кроме того, я не принимаю какое-либо решение на основе ответов здесь. PHP мой выбор языка; Мне просто было интересно узнать о его дизайне.

Ответы [ 8 ]

39 голосов
/ 11 сентября 2009

Одной из причин является отсутствие JIT-компилятора в PHP, как уже упоминали другие.

Другая важная причина - динамическая типизация PHP . Динамически типизированный язык всегда будет медленнее, чем статически типизированный, потому что типы переменных проверяются во время выполнения, а не во время компиляции. В результате языки со статической типизацией, такие как C # и Java, будут значительно быстрее во время выполнения, хотя обычно их приходится компилировать заранее. JIT-компилятор делает эту проблему менее важной для динамически типизированных языков, но, увы, в PHP нет встроенного (хотя см. Пример Facebook HHVM для стороннего JIT для PHP).

9 голосов
/ 11 сентября 2009

Полагаю, вы немного разбираетесь здесь в сравнении яблок и апельсинов - при условии, что вы используете все эти языки для создания веб-приложений, здесь есть нечто большее, чем просто язык. (И в большинстве случаев это замедляет работу базы данных; -)

Я бы никогда не предложил выбрать один из этих языков вместо другого на основе аргумента speed .

5 голосов
/ 11 сентября 2009

И Java, и C # имеют JIT-компиляторы , которые принимают байт-код и компилируют в настоящий машинный код. Процесс компиляции может занять некоторое время, поэтому C # и Java могут страдать от более медленного времени запуска, но как только код скомпилирован JIT, его производительность находится на том же уровне, что и любой «действительно скомпилированный» язык, такой как C ++.

4 голосов
/ 11 сентября 2009

Самая большая причина в том, что Java HotSpot JVM и C # CLR используют компиляцию Just-In-Time (JIT). JIT-компиляция компилирует байт-коды до собственного кода, который выполняется непосредственно на процессоре.

Кроме того, я думаю, что Java-байт-код и CIL более низкого уровня, чем внутренний байт-код PHP, что может сделать многие JIT-оптимизации более простыми и эффективными.

2 голосов
/ 11 сентября 2009

Можно предположить, что JAVA зависит от какого-то "сервера" приложений, а PHP - нет, что означает, что каждый раз при вызове страницы PHP нужно создавать новую среду.

(Это было особенно верно, когда PHP использовался как CGI, а не как модуль Apache или через FastCGI)


Другая идея может заключаться в том, что компиляторы C # и JAVA могут выполнять некоторую большую оптимизацию во время компиляции - с другой стороны, поскольку PHP-скрипты компилируются (по крайней мере, если вы не «читерствует» с кешем кода операции) каждый раз, когда вызывается страница, фаза компиляции должна быть очень быстрой; а это значит, что невозможно тратить много времени на оптимизацию.


Тем не менее: каждая версия PHP обычно поставляется с некоторым улучшением производительности; например, при переходе с PHP 5.2 на 5.3 вы можете получить от 15% до 25% процессорного времени.

Например, посмотрите на эти тесты:


Также важно то, что PHP довольно легко масштабируется: просто добавьте пару веб-серверов и вуаля!

Проблема, с которой вы часто сталкиваетесь при переходе от 1 к нескольким серверам, связана с сессиями - сохраняйте их в БД или memcached (очень просто) , и проблема решена!


В качестве примечания: я бы не рекомендовал выбирать технологию, потому что в некотором измерении разница в скорости составляет пару процентов: есть гораздо более важные факторы, например, насколько хорошо ваша команда знает каждую технологию - или даже алгоритмы, которыми вы являетесь собираюсь использовать!

0 голосов
/ 04 ноября 2009

Интерпретируемый язык не может быть быстрее, чем скомпилированный язык или даже язык JIT при тривиальных условиях.

Если ваша тестовая программа не состоит из распечатки "Hello Worlds", если вы беспокоитесь о скорости, придерживайтесь C # или Java.

0 голосов
/ 11 сентября 2009

Зависит от того, что вы хотите сделать. В некоторых случаях PHP определенно быстрее. PHP (довольно) хорош в манипулировании файлами и другими базовыми вещами (в том числе XML). В таких случаях Java или C # могут работать медленнее (хотя я не тестировал).

Кроме того, вывод PHP (HTML или любой другой) должен быть загружен в браузер, что также требует времени.

Кроме того, скорость Java / C # очень сильно зависит от машины, на которой он работает (может быть несколько). Java / C # может работать медленно на вашем компьютере, в то время как PHP работает только на одном сервере, с которого он доступен, и всегда работает так же быстро, как и сервер (за исключением времени загрузки и т. Д.).

Я не думаю, что они в общем сопоставимы. Я думаю, что вам нужно взять задачу, которую вы могли бы выполнить с этими тремя языками программирования, а затем сравнить ее. Это в основном всегда то, что вы должны делать при выборе языка программирования; найти тот, который соответствует задаче. Не формируйте задачу, пока она не соответствует языку программирования.

0 голосов
/ 11 сентября 2009

Согласно википедии , PHP использует Zend Engine , который не имеет a JIT .

...