Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Are you ready? Benchmarks frameworks: PHP 7 vs. Node.js 4.4.7

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Вхідні дані

В цій темі будуть використані

NodeJS-frameworks:
1. Express 4.13.4
2. Restify 4.0.3

PHP-frameworks (пояснення вибору в кінці тестів):
1. Codeigniter 3.1.0
2. KohanaFramework 3.3.6

Вони працюватимуть відповідно на Node.js 4.4.7 та PHP 7 (+ Apache 2.4.18), виводитимуть стандартний «Hello World!».

Тести будуть проводитись на Ubuntu 16.04:

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    1
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             AuthenticAMD
CPU family:            16
Model:                 4
Model name:            AMD Phenom(tm) II X4 945 Processor
Stepping:              3
CPU MHz:               1800.000
CPU max MHz:           3000,0000
CPU min MHz:           800,0000
BogoMIPS:              6015.61
Virtualization:        AMD-V
L1d cache:             64K
L1i cache:             64K
L2 cache:              512K
L3 cache:              6144K
NUMA node0 CPU(s):     0-3

Тести

1000 запитів без конкуренції

по часу виконання (менше — краще)

по кількості запитів за секунду (більше — краще)

1000 запитів з конкуренцією 10 шт за раз

по часу виконання (менше — краще)

по кількості запитів за секунду (більше — краще)

Прокачаємо NodeJS-фреймворки — використаємо усі 4 ядра процесора (в режимі cluster)

1000 запитів з конкуренцією 10 шт за раз

по часу виконання (менше — краще)

по кількості запитів за секунду (більше — краще)

Підсумок

Як бачимо, PHP-фремворки без конкурентних запитів, тобто в однопоточному режимі, показують майже в двічі меншу швидкість,
ніж NodeJS-фреймворки.

Коли додали конкуренції, PHP-фреймворки легко обійшли NodeJS-фреймворки за рахунок багатопоточності та спільного використання opcache php-процесами.

Ну і вже коли використали 4 ядра для кластерного режиму Node.js, то NodeJS-фреймворки підтягнулись, і навіть трохи обігнали PHP-фремворки.

Покищо ще не навчився фіксувати спожиту пам’ять за час проведення тестів, теоретично — NodeJS-фреймворки мали б кращі показники,
але до проведення цих тестів, я думав що NodeJS-фреймворки в рази обженуть PHP-фреймворки...

Оновлення від 01.08.2016 13:56

Оскільки в коментарях часто питають про неперспективність вибраних PHP-фреймворків, то мушу прокоментувати свій вибір.

Справа в тому, що мені, як колишньому розробнику PHP, який перейшов на JavaScript/TypeScript, більш цікаво було порівняти одні з найшвидших фреймворків на платформах PHP та Node.js, в контексті виходу сьомої версії PHP. Усі вибрані фреймворки можна назвати мінімалістичними, досить добре відомими серед розробників.

Slim, Silex, Yii, Symfony, Laravel — всі вони повільніші за Codeigniter, по крайній мірі так було десь 3-5 років назад, коли я їх усі тестував на PHP 5.4. Щоправда phpixie тоді був самим швидким фреймворком, але я з ним майже не знайомий, на відміну від вибраних PHP-фремворків.

Якщо хтось хоче показати що, можливо зараз вже Slim чи Silex обганяють CI, — welcome у коментарі, або ж навіть створюйте нову тему із «интригами, скандалами, расследованиями».

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Вот прав Алексей Шипилев, который говорит, что большая часть людей, которые пытаются тестировать производительность не тестируют вообще ничего.

При постановке эксперимента, если не понимать почему именно такие результаты, то это тоже вообще ни о чем.

На счет выбора фреймворка, претензии абсолютно глупые. По факту, для проекта мы выбираем какой-то фреймворк, CI реально быстрее того, что с большой вероятностью будет использоваться, так что, при сравнении JS и PHP тут действительно все корректно.

Но второй момент, было бы странно, если бы самым критичным место на проекте было отдача строк из строковых литералов.

Поэтому, при сравнении PHP, который синхронный, даже если есть костыли для асинхронности, но реально близко к 100% в реальных проектах он используется синхронно, и JS, который асинхронный по свое природе нужно сравнивать всего два кейса:
1. Мало логики, чисто CRUD, возможно еще и работа с файлами.
2. Много логики, когда время в самом скрипте больше времени ожидания.

Тогда можно понять, на сколько разница критична именно для Вашего проекта, но вот если в первом варианте у Вас Node.js не рвет PHP, то нужно разбираться где у Вас ошибка в тестах. Хотя, конечно, эта разница может для Вас быть не критична по другим причинам.

и JS, который асинхронный по свое природе

ти так більше не жартуй

А що буде, якщо простий вивід Hello World замінити на
sleep(1); echo "Hello World"; - для PHP
і
setTimeout(function(){ res.end("Hello World"); }, 1000) - для node.js
?

це не правильно, бо сліп заморозить процес, а нода піде в той час оброблювати інші запити

Так це ж і є основний use case node.js, коли основне / суттєве навантаження йде на щось зовнішнє, блокуюче поток.

Это тестирование производительности фреймворков? В чем смысл этих тестов, что нужно было показать? Что многопточный node js framework Restify 4.0.3 работает быстрее чем однопоточный php7 Codeigniter 3.1.0 ?

Что многопточный node
Подозреваю, чтоб показать, что многопоточная нода работает медленнее чем однопоточная.

Я сделал бенчмарк Кобола с Go, вот мои результаты.

Автор, либо делайте актуальные бенчмарки — либо нафиг так жить. Мусор же.

Що ви розумієте під «актуальные»? Правильно я розумію, що ви хочете побачити інші якісь фреймворки? Чому б вам не показати як треба зробити по-правильному... ну або хоча дати лінк на ДОУ, де зробили кращі бенчмарки.

меня тема таких бенчмарков не интересует, поэтому я и не буду делать и показывать «как надо». Если вы беретесь что-то сделать — то делайте сразу нормально, а не «и так сойдет», а не нравится — сделайте сами.

И да — я бы хотел увидеть другие фреймворки — Slim 3, Symfony 2, ZF3, Laravel 5.2 etc

Но даже не касаясь фреймворков — бенчмарки делаются при одинаковых условиях, у вас как у том анекдоте — летели два крокодила — один зеленый, другой налево. То есть условия разные, тесты странные, фреймворки выбраны неактуальные. Зачем вообще такой бенчмарк делать?

Так ви навіть лінк не потрудитесь знайти на ДОУ, де все зроблено «так як треба»? Не забагато ви тоді хочете від інших?

Не страшно що для вас це маразм, головне щоб це не було маразмом для тих людей, хто аргументує свою оцінку, причому не в контексті чогось свого свіжо-висосаного з пальця, а на основі того що справді є в цій темі.

Каждый фреймворк выбирается под конкретную задачу. Вы бы еще взяли симфони, запихнули бы фразу хеллоу ворлд в БД и тянули бы ее оттуда через доктрину без кеша, вообще бы удивились нахрена эту симфони так хвалят, если у нее такая тяжелая ОРМ для работы с бд?

Так почему бы вообще не взять 1 файлик, написать echo ’Hello World!’; и проверить насколько он будет быстро работать? Для поставленной задачи — это самое то.

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

отчасти соглашусь, но

Так почему бы вообще не взять 1 файлик, написать echo ’Hello World!’;

один файлик для ноды это будет что-то типа
require('http').createServer(function(req, res) { res.writeHead(200); res.end('Hello World'); }).listen(8080);
где нода сама и слушает порт

а для php это будет
<?= 'Hello world' ?>
где порт слушает apache | nginx | etc (тысячи их), запускает процесс пхп и прочее, что займет дополнительное время.

В пэхопэ тоже есть встроенный веб-сервер. А вообще 1 файлик — это index.html с

Hello, world!

и здесь HTMLу нет равных среди языков. Так что предлагаю выбросить весь этот пых и джабоскрипт и писать хеллоу-ворлды на чистом хтмл
Як бачимо, PHP-фремворки без конкурентних запитів, тобто в однопоточному режимі, показують майже в двічі меншу швидкість,
ніж NodeJS-фреймворки.
тоесть вы сравнивали
1) голый инстанс ноды висящий в памяти и слушающий порт
с
2) апачем, который дергает пхп, где пхп каждый раз подключает по 200 файлов и инстанциирует сотни объектов?
Оо.
офк какая-нибудь кохана будет медленне выдавать HelloWorld, т.к. там один апач и запуск процесса пхп ~40мс к обработке запроса добавит, а сбор всех зависимостей еще ~40-80мс.

если сравнивать Node.js с PHP, то тогда уж и пхп надо запускать демоном с eventloop (amphp или react.php), а ноду запускать через балансеры — 10 инстансов ноды vs 10 инстансов реакта через nginx. и сравнивайте, кто быстрее.

а так тест какой-то несуразный.

Kohana вроде как не развивается. Брали бы Symfony. Да и версия node не последняя

Apache, Codeigniter и Kohana в 2016-м году... Автор, ты в криокамере провел последние 5 лет?

Ты вник в суть тестов или у тебя срабатывает рефлексия на эти названия и ты просто показываешь её здесь? Когда ты сделал свой вывод, тебя не смутило названия самой темы о PHP 7 vs Node.js 4.4.7?

Я вник в суть того, что ты запостил тут херню, не имеющую ни малейшей связи с современными реалиями, которую гордо назвал тестами производительности.

KohanaFramework на PHP 7 працює справно, і як бачимо майже так само швидко як один із найвідоміших лідерів серед PHP-фреймворків по швидкості.

ну, как бэ кохану автор брал 2016го года выпуска, если что.
а во вторых пхп7 сам по себе быстрее, чем пхп 5, а не из-за каких-то дополнительных фишечек, типа массивов в константах, групповых use и оператора ??.

что, собственно, не отменяет факта бредовости теста. но это уже совсем другая история.

Артем, если учесть что CodeIgniter 4 полностью переписанный, и использует NameSpaces, PSR-4б и все остальные новые стандарты, то ирония запоздалая...

и смысл этого всего? При нынешних копеечных ценах на железо и скорости инета конечный пользователь разницу в скорости не ощутит а разработка на пыхе проще а соответствено дешевле (труд програмиста нынче дороже железа) и быстрее.

почему CI и Kohana? express/restify стоило бы сравнивать с slim/silex

и где php-fpm? ради интереса еще можно и php-pm взять

Років зо три я тестував і slim, і silex, вони тоді програвали codeigniter по швидкості. Якщо є бажання, протестуйте й порівняйте їх самі, може за цей час щось змінилось, відпишетесь.

ни сорцов ни деталей нифига, вы бы на то как люди это делают посмотрели бы что ли для начала

«Сорцы» цікаво дивитись на чомусь більш складному, ніж Hello World! Якщо зайти на будь-який із сайтів, перерахованих фреймворків, то там приклади Hello World можна дуже швидко знайти, при бажанні.

Щодо деталей, — про які деталі ви питаєте?

хелоу ворд вообще не интересно
посмотрите что у techempower обычно пишут ( не идеал но хоть что то )
Потребление памяти, cpu — такие детали

Мені нижче в коментарях підказували за rusage(), але ще не вивчив як це можна використовувати.

ну збс, а зачем ваш тест вообще нужен без таких мелких деталей то?

Прокачаємо Node.js — використаємо усі 4 ядра процесора (в режимі cluster)
Я правильно понимаю, что после увеличения кол-ва используемых ядер на 300% пропускная способность ноды выросла на 30%?

Правильно. Я в цьому підозрюю pm2, який використовую для управління веб-серверами на Node.js.

Це особливо стає помітним, коли вмикаю режим кластера і роблю 1000 запитів без конкуренції. В такому разі продуктивність падає в порівнянні з режимом «форк» (у звичайному режимі). Тобто начебто збільшив кількість використовуваних ядер, але продуктивність навіть падає при тестах в один потік.

Так может, сначала нужно пофиксить бенчмарк, чтоб он работал так, как должен, а потом делать выводы и публиковать результаты?

Відчувається що ви знаєте в якому напрямку копати, — мені взяти й переписати pm2, чи може написати свій менеджер процесів?

pm2 один із найвідоміших менеджерів з хорошими відгуками, поки Node.js не зробить свій вбудований аналог, прийдеться використовувати те що є.

Зайти на форум pm2/node спросить, покопаться в списке issues на гите, погуглить, не?

Ви можете продемонструвати «як треба було зробити» — напишіть свої тести і викладіть на ДОУ. Чи вам слабо?

Вроде бы не я кривой бенчмарк на доу выложил, почему вы думаете, что я буду его для вас переделывать? Я вам указал на то, что по результатам очевидно, что бенчмарк сделан немножко по дибильному. Ваше дело — исправлять, или и так сойдет

Подібні зауваження добре сприймаються від людей, які самі вміють робити те, про що говорять. Я по вашим темам/коментарям не бачу що ви із цим краще б справились.

Заради інтересу не використовував pm2, а запустив кластер по прикладу приведеному в доках Node.js. Нічого не змінилось — коли запускаю чотири процеса в кластері, вони показують меншу продуктивність при одному потоку запитів, ніж коли це робить один процес.

Для чого? Для того, щоб побачити що нічого не змінилось?

Ось вам код для restify у кластерному режимі. Він не показав помітних змін, у порівнянні із запуском через pm2.

const cluster = require('cluster');
var restify = require('restify');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  
  function respond(req, res, next) {
    res.send('Hello World!');
    next();
  }

  var server = restify.createServer();
  server.get('/', respond);

  server.listen(8080, function() {
    console.log('%s listening at %s', server.name, server.url);
  });
}

А клиенты крутились на той же машине что и приложение ?
По хорошему надо реально разносить их по разным машинам + желательноь кластер с клиентами .... ну возврат строки это слишком примитивно для корректной оценки .... хотябы какой-то простой ToDo и погонять

А сколько загрузка CPU при тесте ? может упирается не в CPU а в I/O на пример, полезной работы очень мало и накладные расходы на переключение контекстов между процессами выходят на первое место на пример.

Чудово. Добав, будь ласка, порівняння кількість keep-alive конектів по кожному.

Тестував я також із keep-alive, усі фреймворки дуже добре сприймають цю опцію, але який сенс це має в даному контексті? Все-одно один клієнт навряд чи запитуватиме більше однієї динамічної сторінки за раз.

Кожен інструмент має свої нюанси і підводні камні. Немає сенсу порівнювати nodejs vs. php на швидкість. Nodejs використовується у випадках, коли потрібні keep-alive, WS зєднання. PHP — краще працює з обчисленнями.

До речі, якщо у тебе є вільний час — це було б дійсно цікаво перевірити.
Від себе: Для хабру знайди конкурентну перевагу і не здавайся.

Я не буду писать простыню, хотя пройтись по теме весьма чешутся руки. У меня простой вопрос: почему для теста PHP вы выбрали 2 мертвых фреймворка ?

Я вибрав найшвидші відомі фреймворки, хоча можна було ще тестанути phpixie.com. Перспективність розвитку кожного з фреймворків не так важлива для подібних тестів, бо при такому виборі, по-суті, я тестую платформу, на яких вони використовуються: PHP та Node.js.

а вообще да, надо было попробовать симфони/ларавел

Тести PHP-фреймворків були б десь на 50% гіршими, я так думаю (колись було діло, тестував на PHP 5.4 Codeigniter та Yii останніх версій, тоді Codeigniter обійшов Yii більше, ніж вдвічі по Hello World)

А кто вам сказал что это самые быстрые фреймворки? Взяли бы Slim, Phalcon.

Я тестував і Slim, він помітно повільніший за Codeigniter. Phalcon не цікавить, бо окрім PHP там ще треба щось доставляти і, на скільки я чув за нього, він не простий у налаштуванні/підтримці.

Я вибрав найшвидші відомі фреймворки
А розробники при можливості обирають сучасні з більшими можливостями, а не найшвидші
Покищо ще не навчився фіксувати спожиту пам'ять за час проведення тестів,

Взяти struct rusage з wait4(2).

Бенчмарки хеллоуворлдом без наведення коду. Без няшних графічків, проте з простинею вихлопу ab. Некорректне порівняння з некорректним представленням. Вибір переможців по життю!

Саме так. Хоча й знаю, що вата вибирає інші опції.

WTF? Це серйозне зауваження, якщо ви маєти мету зробити якісь висновки.
А не просто показати, що вмієте запускати тест.

Для мене звично читати ці тести, думав що для інших також... Ок, може зараз зроблю графіки.

вата
Так незграбно політику в айті ще ніхто не пропихував :-)

Я використав код для Hello World, який є на сайтах кожного із фреймворків.

Сразу виден грамотный подход senior divan analyst-a.

а де NGINX ? Чому АПАЧ? Чому такий незрозумілий вибір PHP фреймворків? Якщо проводити тестування то потрібно це робити на самой сцчасної інфраструктурі для двох технологій.

Nginx є, але для підтримки PHP використовую саме Apache, багато читав що це кращий варіант.

Для чого найкращий? Але самий швидкий - nginx + php7.0 - fpm. А тест у вас на швидкість.

Саме так, nginx використай для того щоб відсіяти статику. Для обох випадків. Тоді й побачиш, що різниця таки є. Але багатопоточність... це майже не потрібно веб-фрейморкам через те що вони за природою є паралельними. Тобто, кластер розгортай одразу і на PHP, і на NodeJS — і нехай собі працюють. Пам′яті вони жеруть зовсім небагато.

Проблема Апача — те що він має контролювати правила доступу до директорій, та брати за собою усі модулі, навіть коли в конкретному запиті це все непотрібно. Але це проблема усіх скриптових мов, тому nginx їм дуже допомагає.

Взагалі на таких завданнях тест майже нічого не скаже. Треба реальний highload будувати, і дивитися що станеться, де вузькі місця. Для переважної більшості проектів це не буде потрібно ніколи, влаштують ті рішення що із коробки. А от розробка під highload — річ не з дешевих. Іноді, якщо не завжди, наростити потужність виходить дешевше.

Підписатись на коментарі