Продолжая традицию, начатую в одной из старых заметок стравим-ка PHP и Node.js.
Быдлокод против хипстерни, олдскул против неофитов.
В этот раз, правда, будет не сравнение удобства написания чего-либо, а простой и весьма синтетический тест на производительность.
Раз уж мы делаем веб-приложения, почему бы не проверить ?
Итак, в левом углу ринга в зеленых трусах - ghost, работающий на node.js.
В правом углу ринга - PHP5.
Node.js обслуживает пока что только Ghost, PHP5 же обеспечивает работу “магазинчика”.
Проверять мы будем по методике описанной здесь.
Команда для ab:
ab -n 1000 -c 5 -g output.txt http://target_url
Итого - 1000 запросов по 5 штук параллельно.
Общий размер памяти сервера - 256мб, это виртуалка на XEN. PHP5 ускорена с помощью APC.
Оба бойца работают “под” lighttpd, то есть для Node.js запросы проксируются, а для PHP5 исполняются на сервере через php-cgi. Считаем, что APC настроен правильно.
Графики будем строить по методике, описанной здесь.
Поехали!
О чем мы думаем, глядя на этот кирпич ? Подавляющее большинство запросов лежит ниже отметки 550мс.
Ок, для начала неплохо. Смотрим статистику:
Concurrency Level: 5 Time taken for tests: 107.351 seconds
Complete requests: 1000 Failed requests: 0
Write errors: 0 Total transferred: 12977000 bytes
HTML transferred: 12695000 bytes Requests per second: 9.32 [#/sec] (mean)
Time per request: 536.755 [ms] (mean) Time per request: 107.351 [ms] (mean, across all concurrent requests)
Transfer rate: 118.05 [Kbytes/sec] received
Теперь перегружаем хост, повторяем тоже самое для PHP. В URL указываем страничку “имяфайла.php”, чтобы быть уверенными в том, что код на сервере будет исполняться.
Итак, время запросов немножко подросло. Вроде незаметно, but wait! PHP у нас исполняет одну страничку без доступа к БД, с простейшим кодом, а Node.js “тащит” на себе целый Ghost.
Статистика:
Concurrency Level: 5 Time taken for tests: 108.562 seconds
Complete requests: 1000 Failed requests: 989
(Connect: 0, Receive: 0, Length: 989, Exceptions: 0) Write errors: 0
Total transferred: 12991521 bytes HTML transferred: 12596360 bytes
Requests per second: 9.21 [#/sec] (mean) Time per request: 542.812 [ms] (mean)
Time per request: 108.562 [ms] (mean, across all concurrent requests) Transfer rate: 116.86 [Kbytes/sec] received
Видим безумное количество Failed Requests. Это означает (?) что многие запросы либо не дошли, либо рухнули на сервере, короче “не работает” нормально.
Посмотрим все вместе:
Что видим - php5 код работает помедленнее. С учетом того, что куча запросов просто “провалилась” - ситуация явно не в пользу PHP.
На самом деле, в идеальной ситуации, тестирование надо было проводить на более быстрой машине, с распоследними пакетами, распоследним “всем”.
Скрипты должны выполнять одни и те же действия, например:
- Выводить “Hello, World”
- Делать SQL-запрос в одну и ту же базу данных
- Желательно, чтобы они написаны максимально “одинаково”
Но тем не менее, результат заметен, и, на мой взгляд, очевиден.