Всем привет! Продолжение противостояния 2х языков.

Сегодня у нас будет более честное сравнение, которое отображает большинство реальных задач.
Итак, мы сегодня сравним PHP и Node.js по следующим признакам:

  1. Типичная динамическая страница
  2. REST API


Важно! Ответы на вопросы и предъявы которые могут возникнуть:

Вопрос: А если запустить Node.js в кластере, будет ведь быстрее?
Ответ: На одно ядерном процессоре будет медленнее. (Проверено неоднократно)

Вопрос: А если в Node.js использовать для соединения с mysql пул коннектов, наверное отработает быстрее, из-за распараллеливания запросов?
Ответ: На одно ядерном процессоре будет медленнее. (Проверено неоднократно)

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

Предъява: Да ты походу все подстроил, полюбому реальные результаты будут другие.
Ответ: Код тестов в открытом доступе на гитхабе, скопируй и убедись сам.

Предъява: ab надо запускать не на сервере на котором работают тестируемые бэкенды, а на другом компе.
Ответ: Разъяснять лень. Но если в 2х словах, то ab практически не отнимает ресурсов во время теста и дает более реальные цифры на которые способен именно твой сервак.

Конфигурация сервера:
Простой VDS — 1 ядро процессора 2ГГц, 1Гб оперативы, 10Гб SSD.
ОС: Debian 8.6.
Так же произведены базовые настройки ядра, чтобы сервер в принципе мог обрабатывать большое кол-во соединений.

Я нагенерировал данных в таблицу (100 записей).

Приступим.

Первый этап (одинарные запросы): из 10 одинарных запросов на каждого испытуемого выбираем среднее значение.

Node.js — Типичная динамическая страница

image

Node.js — REST API

image

PHP — Типичная динамическая страница

image

PHP — REST API

image

Как видим, разница по скорости генерации отличается в разы, и PHP этот раунд выигрывает.

Второй этап (нагрузочное тестирование):

Из 10 прогонов на каждого испытуемого выбираем среднее значение. Тут нас интересует сколько запросов в секунду способен обработать наш сервер. 3000 запросов в 1000 потоков. #ab -n 3000 -c 1000…

Node.js — Типичная динамическая страница

image

Node.js — REST API

image

PHP — Типичная динамическая страница

image

PHP — REST API

image

Динамическая страница — PHP быстрее почти в 2 раза (1.78 если быть точным)
REST API — PHP быстрее почти в 3,5 раза (3.32 если быть точным)

Ссылка на репозиторий с кодом для тестов

По поводу конфигов системы, пхп, Mysql
У меня настроено так, чтобы работало максимально быстро.
Если вы не знаете как должна быть настроена операционная система, php, nginx и mysql. Это не моя проблема.

Буду очень признателен, если вы напиши свои варианты реализации REST API для Node.js, чтобы результаты были более быстрыми чем у меня. И оставляйте код в комментах, я буду проводить замеры и писать результаты. Цель догнать, а лучше перегнать PHP.

UPDATE


По совету пользователя dos поменял в Node.js драйвер MySQL на github.com/mscdex/node-mariasql и результаты изменились кардинально!

Обновленные результаты по Node.js

Этап 1

Node.js — Типичная динамическая страница
image

Node.js — REST API
image

Этап 2

Node.js — Типичная динамическая страница
image

Node.js — REST API
image

Динамическая страница — Node.js быстрее в 1.16 раза(на 16%)
REST API — Node.js быстрее в 1.26 раза(на 26%)
В качестве бэкенда для своего будущего проекта я выберу

Проголосовал 441 человек. Воздержался 121 человек.

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

Поделиться с друзьями
-->

Комментарии (91)


  1. Sasha_Pitenin
    04.03.2017 21:01
    +5

    По картинкам видно, что генерируется разный ответ, даже разный размер страницы, тесты не одинаковые! Еще и не понятно как запускается NodeJS в дебаг режиме или в релизе, а от может зависит и скорость.


    1. kanstantsin
      04.03.2017 21:05
      +1

      А какие у вас результаты?


    1. MaZaAa
      04.03.2017 21:15

      Nginx отправляет заголовки отличные от тех что отправляет модуль http в ноде, вот и все дела


  1. AndreyRubankov
    04.03.2017 21:47
    +1

    https://github.com/mazabenchmarks/NodeVsPHP/blob/master/rest_api.js

    function mysqlQuery(query, cb) {
        connection.query(query, function (err, results, fields) {
            cb({err, results, fields});
        });
    }
    
    function generatePage(res) {
        const time = process.hrtime();
        mysqlQuery("SELECT * FROM `users`", ({err, results, fields}) => {
            let response = JSON.stringify(results);
            const diff = process.hrtime(time);
            const generationTime = diff[1] / 1000000;
            response += `<div><b>Страница сгенерирована за: ${generationTime}ms</b></div>`;
            res.end(response);
        });
    }

    а зачем вы столь извращенно завернули обращение к базе в «свой апи»?
    вы же этим кодом вставляет палки в колеса JIT'у.

    почему нельзя было сделать так?:
    function generatePage(res) {
        const time = process.hrtime();
        connection.query("SELECT * FROM `users`", function (err, results, fields) {
            let response = JSON.stringify(results);
            const diff = process.hrtime(time);
            const generationTime = diff[1] / 1000000;
            response += `<div><b>Страница сгенерирована за: ${generationTime}ms</b></div>`;
            res.end(response);
        });
    }


    1. Shannon
      04.03.2017 23:06

      На ноде никто так не делает, делают примерно вот так:

      const Promise = require('bluebird')
      const mysql = require('mysql')
      const pool = mysql.createPool({
          host: 'localhost',
          user: 'root',
          password: 'pwd',
          database: 'test',
          connectionLimit: 100
      })
      pool.query = Promise.promisify(pool.query)
      
      function generatePage(res) {
          const time = process.hrtime()
          pool.query(`SELECT * FROM 'users'`)
              .then(results => {
                  let response = JSON.stringify(results)
                  const diff = process.hrtime(time);
                  const generationTime = diff[1] / 1000000;
                  response += `<div><b>Страница сгенерирована за: ${generationTime}ms</b></div>`
                  res.end(response)
              })
              .catch(err => console.log(err))
      }
      


      1. AndreyRubankov
        04.03.2017 23:19

        С пулом коннектов еще лучше.
        Я не node.js дев, потому лишь указал на явный косяк в коде.


        1. D01
          05.03.2017 08:12

          Смысл вывести вот так вызов в отдельную процедуру — это как в реальном проекте вынести работу с БД в отдельный модуль и дергать только одну эту процедуру из него. (т.е. все правильно, только pool конечно лучше)


          1. AndreyRubankov
            05.03.2017 10:29

            Идею я понимаю, но не поддерживаю:
            1. если не преследуется цель написать DAL, чтобы потом можно было менять имплементацию коннектора, то смысла в этом нету.
            2. в версии ПХП этого теста, даже функций нету — сплошное полотно.

            Если была цель сделать как в реальной системе — были бы модули, подключался хотя бы PDO, а не функция mysqli, которая еще с php4 тянется в коре.
            А так, это похоже на попытку написать код так, чтобы он просто работал хуже.


            1. MaZaAa
              06.03.2017 09:26

              mysqli работает быстрее. В моих тестах PDO дает более медленный результат — на 100 запросов в секунду


              1. AndreyRubankov
                06.03.2017 11:00
                +3

                Честно говоря, я не понимаю вашей цели.
                В реальных проектах на php уже давно не пишут простыню кода. И уж тем более не делают смесь html + php + sql, как это будет у вас при вашем текущем подходе.

                Измерять скорость работы в попугаях в двух задачах, которые даже близко не лежали с реальными — зачем? Ради холивара? — ок, вам это получилось. Ради правды? — так вы не узнаете ничего.

                И снова таки: если вам нужна производительность системы — возьмите платформу, которая даст производительность из коробки — компилируемые языки такие как C#, Java, Scala, Go.

                ps: а задачи php и node.js в целом не схожи между собою: php нацелен на CPU-bound обработку, node.js — на IO-bound. В нормальной системе было бы хорошо даже совмещать их, нежели пихать невпихуемую логику в конкретную из платформ.


      1. MaZaAa
        05.03.2017 11:04
        +1

        Как я и говорил выше, когда писал вопросы и ответы, с пулом результат хуже, а конкретно лучшее что чего мне удалось добиться за 10 прогонов это 380 запросов в секунду…

        Кусок кода

        const mysql = require('mysql2');
        const Promise = require('bluebird');
        const http = require('http');
        
        const pool = mysql.createPool({
            host: 'localhost',
            user: 'root',
            password: 'pwd',
            database: 'test',
            connectionLimit: 100
        });
        pool.query = Promise.promisify(pool.query);
        
        function generatePage(res) {
            const time = process.hrtime();
            pool.query('SELECT * FROM `users`')
                .then(results => {
                    let response = JSON.stringify(results);
                    const diff = process.hrtime(time);
                    const generationTime = diff[1] / 1000000;
                    response += `<div><b>Страница сгенерирована за: ${generationTime}ms</b></div>`;
                    res.end(response)
                })
                .catch(err => console.log(err))
        }
        
        

        connectionLimit пробовал ставить разный и 10 и 50 и 100 и 1000. Лучший результат — 380 запросов в секунду…


        1. Shannon
          05.03.2017 17:36
          +1

          Это потому что ваш тест говно, прощу прощения за мой французкий


          1. MaZaAa
            05.03.2017 17:47
            -2

            На каком месте пукан бомбануло?)


            1. Shannon
              05.03.2017 21:06
              +1

              Вот вы и сами подтвердили что ваш тест говно
              https://habrahabr.ru/post/323208/#comment_10103096


  1. D01
    04.03.2017 22:10
    +1

    Интересные результаты!
    А не могли бы Вы исключить драйвер БД из расчетов? Сделать тоже самое, но только из массива данных. (в PHP счетчик включить после формирования массива)


    1. MaZaAa
      04.03.2017 22:29

      С массивами пхп работает в разы быстрее, я уже проверял


    1. MaZaAa
      04.03.2017 22:33

      https://habrahabr.ru/post/320670/ вот статья


      1. Maiami
        04.03.2017 23:15
        +2

        По ссылке:

        node 7.3.0
        test3 (array): 53.455ms
        
        php 7.1.1
        test3 (array): 63.453ms
        

        То есть php не «в разы быстрее», а медленнее

        С этим «тестом» та же история, только новичков пугать, не зря минусуют. Или кто-то верит, что существуют приложения без пост обработки данных после получения их с базы данных? Добавить немного логики в вычисления, и красивые цифры в пользу php разрушаться


        1. MaZaAa
          04.03.2017 23:17
          -6

          Да да да, конечно же.


    1. ilnuribat
      05.03.2017 10:23

      Кстати, как вариант сделать чтение из файла
      С простой логикой, вроде подсчёта возрастов, или подсчёта людей по полам
      Тогда исключим влияние сторонних библиотек


  1. bioroot
    04.03.2017 22:11
    +5

    Я бы ещё заметил, что добавление к строке в цикле

    for (let i = 0; i < results.length; i++) {
        response += `<span>Hello <i>${results[i].login}!</i> </span>`;
    }
    

    это не то же самое, что просто выплёвывание строки через echo в случае с PHP
    while ($row = $res->fetch_assoc()) {
        echo "<span>Hello <i>{$row['login']}!</i> </span>";
    }
    

    Склеивание строк — не самая дешёвая операция. А скорость работы через echo в свою очередь зависит от буферизации ответа.


    1. MaZaAa
      04.03.2017 22:29

      Альтернатива?


      1. D01
        04.03.2017 22:34
        +1

        Как то так

        let max = results.length;
                for (let i = 0; i < max; i+=1) {
                    res.write(`<span>Hello <i>${results[i].login}!</i> </span>`);
                }
                const diff = process.hrtime(time);
                const generationTime = diff[1] / 1000000;
                res.end(`<div><b>Страница сгенерирована за: ${generationTime}ms</b></div>`);
        


        1. MaZaAa
          04.03.2017 22:38

          Завтра напишу какой результат по скорости с такой реализацией


        1. MaZaAa
          05.03.2017 10:52

          Результат ещё хуже, за 10 прогонов подряд лучший результат — 150 запросов в секунду…


      1. bioroot
        04.03.2017 22:48

        С ходу не скажу, т.к. боюсь наврать. В работе Node.js с буфером ответа не разбирался. Но в качестве лобового решения предложил бы следующее:
        1. Прикрутите в PHP переменную и склеивайте в неё ответ как в случае с Node.js
        2. А зачем вам вообще Nginx? Запустите в консоли два скрипта и измеряйте их скорость.


        1. Rastishka
          05.03.2017 03:37

          1. Зачем если есть стандартный способ вывода? Надо node.js сделать по аналогии, выплевывая в аутпут. А конкатенация строк в php кстати очень быстрая: https://www.urbaninsight.com/performance-test-string-concatenation-php (да, еще один сферический тест в вакууме).
          2. Зачем убирать nginx? Лучше же когда конфиг максимально близок к работающему в боевом режиме.


          1. bioroot
            05.03.2017 16:25
            +2

            1. Ну у меня больше опыта с PHP, в Node.js не знаю тонкостей. Если можно сделать эквивалентные способы, то пожалуйста.
            2. Боевые конфиги тоже бывают разными. Тут просто надо определиться, что тестируем. Если сферическое приложение, то лучше бы добавить хотя бы шаблонизаторы. Если скорость взаимодействия с nginx (что довольно бредово, но тестировать можно всё что угодно), то надо выкидывать базу данных. Если скорость отрисовки строк, вынутых из mysql, то nginx не нужен.


            1. MaZaAa
              05.03.2017 17:01
              -2

              Похоже вы не поняли смысл теста и что именно тестируется, прочитайте текст внимательнее. Сравнение 2х примеров реального приложения. Какой язык заставит пользователя меньше ждать результата от сервера.


              1. bioroot
                05.03.2017 19:19
                +3

                Не знаю как у вас язык повернулся назвать это «реальным приложением». Типичный сферический конь.

                И медленный ответ сервера может значить в равной степени и его кривую настройку. Почему я вам выше и предлагал пустить два чистых скрипта без nginx и сравнить результаты. Ну или добавьте на гитхаб конфиги nginx'а хотя бы.

                И, честно говоря, судя по вашим комментариям, у вас нет цели разобраться в том, почему так происходит. За что вас, собственно, и поливают грязью. Одно дело сделать исследование вида «чёрный ящик А работает быстрее чем чёрный ящик Б в сферической задаче Х» и совсем другое разобраться, почему так происходит. Если бы вы провели глубокое исследование по любому участку, начиная со склеивания строк и заканчивая коммуникацией с базой, сравнили бы работу через unix-сокеты с проксированием запроса nginx'ом на другой порт и прочее и прочее, то эффект был бы другим. Пока вы просто плюнули в Node.js с применением странной задачи. Как думаете, убедили ли вы кого-нибудь в своей правоте? Извлёк ли кто-то пользу из вашей стати? Вы сами для себя в чём-то стали лучше разбираться? Пока кажется, что вы просто хотите похоливарить. Как развлечение это годиться, но пользы от этого никому нет. Топик утонет в сотнях таких же непонятных тестов, которые поверхностно показывают что на взятой с потолка задаче побеждает любимый язык автора.


                1. MaZaAa
                  05.03.2017 20:49
                  -1

                  Мне равноценно нравятся 2 этих языка, я обновил результаты в статье с использованием другого драйвере mysql в ноде, и теперь нода лидирует


                  1. bioroot
                    06.03.2017 13:28
                    +2

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


              1. lair
                05.03.2017 20:15
                +1

                Какой язык заставит пользователя меньше ждать результата от сервера.

                Уж если на то пошло, то не язык, а платформа. Язык никого ждать не заставляет.


  1. http2
    04.03.2017 22:40

    #ab -n 3000 -c 1000…

    Никогда не понимал, зачем такакя конкурентность большая в тестах. :)
    Разве столько клиентов придет одновременно?

    Ну а по теме:
    Используем PHP 7.0, преимуществ в 7.1 не вижу. Хз, есть ли для него тот же memcached.
    Но PHP используется, потому что так исторически сложилось.
    Ну и код просто на нем пишется.
    А NodeJS — это чуток другой подход, вся эта асинхронность, чтобы не наделать случайно синхронности.
    Да, оно красиво, может и быстрее работает, но лень разбираться. :)


    1. MaZaAa
      04.03.2017 22:45
      -1

      Работает медленнее чем пхп) а пхп 7.1 быстрее чем 7.0 значительно)


      1. VolCh
        05.03.2017 11:35
        +3

        Сильно сомневаюсь, что значительно. Вот с php 5.3 на 7.0 это значительно. С 7.0 на 7.1 на реальных приложениях ни значительного ускорения, ни заметного снижения потребления памяти.


        1. MaZaAa
          05.03.2017 13:33
          -2

          Если сомневаешься, есть только 1 правильный вариант, взять и проверить самому ;)


  1. dim_s
    04.03.2017 22:59
    +5

    На мой взгляд вы сравнили скорость работы драйверов MySQL для nodejs и php7, а не сам бэкенд.


    1. kanstantsin
      04.03.2017 23:02
      -2

      И это уже не мало, если один из них работает быстрее.


    1. Maiami
      04.03.2017 23:16
      +3

      Не ведитесь на такие псевдо-тесты
      https://habrahabr.ru/post/323208/#comment_10101554


      1. MaZaAa
        04.03.2017 23:22

        Да, я все всех обманываю. Только берешь мой код, запускаешь, смотришь цифры и убеждаешься в том, что тесты не врут


        1. Maiami
          04.03.2017 23:31
          +2

          Нет, не обманываете, а прикидываетесь что не понимаете о чем речь:

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

          Поэтому ваш код брать даже смысла нет, потому что он ничего не делает

          Но если вы настаиваете, что такие бывают, то всё еще проще, для таких приложений уровня как вы тестируете совершенно не важно что брать, потому что там не будет больше 2х человек в месяц


          1. MaZaAa
            04.03.2017 23:36
            -3

            Любая постобработка быстрее в пхп, поэтому без разницы, все равно пхп обгонит)


            1. Maiami
              05.03.2017 03:00
              +3

              node 7.3.0 vs php 7.1.1:

              test1_node (str): 67.853ms 
              test1_php (str): 83.961ms
              
              test2_node (sum): 8.685ms 
              test2_php (sum): 69.857ms
              
              test3_node (array): 53.455ms 
              test3_php (array): 63.453ms
              

              «обогнал» так обогнал, только пятки видны.
              При этом чем больше логики (то есть чем приложение больше приближено к реальному), тем слабее позиции php. Но можно и дальше закрывать на это глаза и прогонять «пустые» тесты без логики


              1. MaZaAa
                05.03.2017 11:35

                Давай так, посмотри код для теста REST API для Node.js, перепиши его так, чтобы результат приблизился к ПХП. И приложи его сюда, в комментарии. Я замерю скорость и скажу результат, если твой код окажется быстрым, то я только буду рад, я люблю и Node.js и PHP, поэтому не отношусь предвзято к какому-то из них, а основываюсь только на экспериментах и фактах.


                1. Maiami
                  05.03.2017 21:11
                  +1

                  Только собралась собирать тестовый стенд, как вы уже сами подтвердили, что php медленнее, хотя я и так об этом говорила уже

                  Если добавить к тестам логики, то php отстанет еще сильнее


  1. Diaskhan
    05.03.2017 00:19
    -3

    Php Был первым, и простым.
    Но если, не завезут Jit, много-поточность, асинхронность, connection pool, технология постепенно вымрет.
    Я сам только писал на php, с nodejs,python,C# только баловался.


    Вопрос сколько php будет вымирать ))
    Жаль конечно что существуют еще люди которые верят что php Rules!


    Php архитекторам надо надо Libuv внедрять!
    Так как новый net core так и сделал !


    1. MaZaAa
      05.03.2017 00:40
      -1

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


      1. zShift
        05.03.2017 17:12
        -2

        Здесь стайная система. Если у вас нет своей стайки — будете на минусе. У вас даже одинаковое колличество минусов и плюсов ровно столько же у ваших оппонентов. Карма в этом случае ничего не значит. Они захватывают аудиторию.


    1. Merkat0r
      05.03.2017 03:01
      +5

      Угу…
      Не холивара ради, но сколько лет я слышу уже что пхп вот-вот вымрет… а он таки живее всех живых, а вымирают лишь модные(появился захайпился и сгорел аки мотылек через условные(!) пару лет) фреймворки\языки, причем пачками :)


  1. majorius
    05.03.2017 00:25
    +8

    толстый тролль


  1. nikitasius
    05.03.2017 00:54
    +3

    Конечно круто, а где конфиги?


  1. antonksa
    05.03.2017 01:18

    Мне пых не нравится по определению.
    Поэтому я промолчу про кривые тесты в сферическом вакууме.


  1. ingumsky
    05.03.2017 02:35
    +6

    Сама по себе идея провести подобное тестирование – хорошая, но это надо делать в лабораторных условиях, гарантировав их идентичность и равное положение обоих испытуемых, а в текущей версии это просто вброс какой-то.


  1. Cryvage
    05.03.2017 03:43
    +1

    Ответ: На одно ядреном процессоре будет медленнее. (Проверено неоднократно)

    Вначале вы говорите:
    Сегодня у нас будет более честное сравнение, которое отображает большинство реальных задач.

    Но разве делать сервис, с серьёзными требованиями к производительности, на таком железе «отображает большинство реальных задач»?


    1. D01
      05.03.2017 08:28

      А почему нет? Лучше взять 5 таких виртуалок, чем одну с характеристиками пяти. Выигрыш и в отказоусточивости и в цене.


    1. MaZaAa
      05.03.2017 11:14
      -1

      Вы возможно не знаете что в PHP 1 запрос = 1 процесс? Т.е. с ростом кол-ва ядер процессора, будет расти производительность, как у пхп, так и у ноды(запущеной в кластере само собой, она ведь однопоточная)) Какие мы можем сделать выводы? Результаты будут такими же, только циферки увеличатся. Вам никто не мешает доказать обратное(прежде всего самому себе). Арендуйте многоядерный сервер, установите Nginx, PHP 7.1.1-FPM и Node.js 7.7.1, скопируйте из репозитория мой код, прогоните тесты и увидите результат сами. Лучше проверить на практике, чем проводить эксперименты в уме. Конфиг ПХП сейчас добавлю в репозиторий


  1. MetaDone
    05.03.2017 09:00

    varnish сравняет счет, так что смысла в таком сравнении нет
    а для числодробилок лучше что-нибудь другое использовать


  1. Gemorroj
    05.03.2017 09:53
    +1

    накинулись все… как же так, немодный php оказывается не такой уж и медленный =)
    по самим тестам необходимо указывать конфигурации. например, включен ли opcache


    1. MaZaAa
      05.03.2017 14:12

      Конечно же включен, он даже из коробки включен)


  1. OnYourLips
    05.03.2017 10:32

    Какой смысл сравнивать разные приложения?
    Почему в PHP-примере нет асинхронной модели работы, а в JS-примере она есть?

    Тест не просто не полезный, а вредный, он навязывает ложные выводы.


    1. MaZaAa
      05.03.2017 11:41

      Разные приложения? приложения абсолютно одинаковые, разных только 2 языка, которые реализуют выполнение одной и той же работы.


      1. VolCh
        05.03.2017 11:48
        +1

        Архитектура у приложений разная. На JS надо писать синхронно, чтобы сравнивать с классическим PHP. Или наоборот, на PHP асинхронно. Если, конечно, есть желание сравнивать языки, а не архитектуры. А по хорошему четыре варианта сравнить с синхронным и асинхронным ио на пхп и джс. Возможно выводы будут типа: php быстрее в синхронной модели, а джс в асинхронной.


        1. MaZaAa
          05.03.2017 11:54
          -1

          Какая разница? Суть одна, быстрее испытуемый А или испытуемый Б. Я например не люблю долгую задержку ответов от сервера, меня прям бесит, поэтому для меня важна скорость работы того, что я пишу.
          Напиши как угодно и с любыми хаками, если это поможет обогнать другой язык, то это просто супер.


          1. VolCh
            06.03.2017 07:49

            Нет ни одна. У вас суть "при использовании A способом B он быстрее чем C при использовании способом D". Но из этого нельзя сделать вывод будет ли при использовании C способом B быстрее или нет. О том, стоит ли сложность C этого ускорения можно ещё поговорить.


      1. OnYourLips
        05.03.2017 22:45

        Вы код по ссылке смотрели? Точно не смотрели.

        В JS у нас асинхронный event-loop, в PHP обычная многопроцессная обработка.
        При этом оба языка позволяют реализовывать оба подхода. И надо сравнивать приложения при одном и том же подходе. Иначе в сравнении нет никакого смысла.


  1. VolCh
    05.03.2017 11:43
    +1

    Для следующего проекта возьму и то, и другое. На PHP — сервисы с HTTP REST like API, на NodeJS — HTTP GraphQL API Gateway, серверный рендеринг React и транслятор событий RabbitMQ в веб-сокеты.


    1. MaZaAa
      05.03.2017 11:49
      -1

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


      1. AndreyRubankov
        05.03.2017 13:16
        +1

        если вы так стремитесь за производительностью, то почему вы взялись сравнивать две не самые то и быстрые технологии? почему не взяли более быстрые: C#, Java, Scala? зачем именно этот холивар между php и node.js?


        1. MaZaAa
          05.03.2017 13:27

          Во первых, с чего вы взяли, что эти языки будут быстрее PHP в конкретных 2х примерах которые я привел? Вы замеряли производительность? Если нет, то можете написать код на любом из этих языков, я запущу его на своей машине и скажу результат.
          Во вторых, я решил сравнить именно эти 2 очень популярных языка и не вижу в этом ничего плохого.
          В третьих, если мне нужна реальная скорость, я напишу это на СИ) Ибо, зачем прибегать к полумерам в виде C#, Java, Scala, Go и т.п. в таком случае)


          1. lair
            05.03.2017 15:44
            +1

            В третьих, если мне нужна реальная скорость, я напишу это на СИ

            Вот вы и ответили самому же себе, почему сравнение "что быстрее — PHP и node.js" лишено большого смысла.


            1. MaZaAa
              05.03.2017 16:09

              Действительно, ведь на си писать быстрее и легче.


              1. lair
                05.03.2017 16:10
                +1

                … осталось распространить эту аргументацию на ваш пост.


      1. VolCh
        06.03.2017 07:55

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


  1. gearbox
    05.03.2017 13:44

    А когда будут тесты по скорости и стоимости РАЗРАБОТКИ кода?  +1 разраб в команду равен +20 средних серверов в аренду. Нахрена считать железо и язык если не ясно сколько стоит разработка?


  1. iShatokhin
    05.03.2017 14:33
    -1

    Долго пытался понять, зачем в коде запроса к BD используется деструктуризация аргументов (причем в обе стороны), но так и не смог. Видимо, чтобы сделать код специально медленнее. И тем более в тесте на скорость странно видеть let а не var. Это тесты из серии — когда очень хочется, чтобы любимый язык победил?


    1. MaZaAa
      05.03.2017 14:45
      -1

      Аааа, я понял! let и const ввели специально чтобы чтобы скорость работы JS упала в 2-4 раза. Ну тогда все просто, нужно просто все поменять на var и тогда нода победит, расходимся).

      А ещё, если я все запросы в БД замeню на

      SELECT `id` FROM `users` WHERE `id` = 1
      
      и тогда нода будет будет работать с базой в 15 раз быстрее, чем пхп!!!
      А я то думаю, как же так, почему такая значительная разница в скорости…


      1. iShatokhin
        05.03.2017 14:47
        +2

        1. let до сих пор не оптимизирован в циклах, потому обычно его там не используют.
        2. Так что там с деструктуризацей, зачем аргументы загонять в объект и потом обратно разворачивать этот объект? Какой сакральный смысл то?


        1. MaZaAa
          05.03.2017 14:52

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


  1. AlexSpaizNet
    05.03.2017 16:30
    +1

    Когда то тоже писял кипятком от скорости NODE.js в случаях когда сервер должен выдержать десятки тысяч реквестов на API который в принципе ничего сложного не делает кроме как выплюнуть малюсенький json. После написания нескольких проектов, которые немного сложнее чем тысячи трехстрочных примеров в интернете, типа идем в базу, берем что-то и выплевываем JSON, я очень надеюсь что когда-нибудь это какашка (nodejs) умрет.

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

    Не ведитесь на цифры, они далеко не фактор. Я уже не говорю о нормальных разработчиках которые реально понимают разницу между Parallel vs Concurrent.

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

    В тоже время PHP я вообще не использую для написания миркосервисов (ну не его это ниша). Если программеры нормальные, PHP это отличное решение для быстрой веб-разработки, особенно для стартапов. Масштабируется PHP тоже очень хороше. А то что работает медленно, можно вынести в микросервис.

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

    P. S.
    На неделе исправил баг в системе, когда CRM умирал (LAMP стэк). После рисерча, нашелся код, от одного разраба который работал в компании в 2015 году. Там было (это я еще почистил от мусора):

    //Задача — найти все депозиты конкретного клиента

    function findUserDeposits($user_id)
    {
        $deposits = $this->getAllDepositsFromDatabase(); // SELECT * FROM transactions
        $transactions = $this->deepCopy($deposits); // deep copy of $deposits array data to new array with array key as row id from database
    
        $results = [];
    
        foreach ($transactions as $transaction) {
            if (('' . ($transaction['user_id'])) !== ('' . $user_id)) {
                continue;
            }
            
            $id = $transaction['id'];
            $result[$id] = $transaction;
        }
    
        return $results;
    }
    


    Не трудно догадаться почему все умерло… Когда я это увидел у меня скатилась слеза…

    Что-то мне подсказывает, дай этому разрабу вместо php, какой-нибудь С или JAVA, ничего бы не изменилось. А вой дай ему NODEJS с коллбэками, то я даже представить не могу что бы он там наколбасил. А вы тут микросекунды считаете. Я сам как инженер люблю цифры, но вот пришел к понимаю того, что это далеко не главное, во всяком случае не там где эти цифры нам показывают в тестах.

    Вот померять скорость обработки изображения например — тут реально есть что мерять и сравнить разные тулзы и языки. А взять с базы, выплюнуть JSON или html страничку, и замерять это — вот уже действительно трата времени.


  1. Alex10
    05.03.2017 17:21

    1. MaZaAa
      05.03.2017 17:38
      -3

      Сколько алгоритмов из этого теста вы применяете? :D


  1. dos
    05.03.2017 19:16
    +6

    Замените mysql2 на https://github.com/mscdex/node-mariasql/ — на вашем же примере у меня время генерации 0,6 ms, против 1,1ms у PHP. Что в иной раз доказывает, что этот тест лишь сравнивает либы по подключению к mysql.


    1. MaZaAa
      05.03.2017 19:29

      Сейчас заменю и проверю


      1. dos
        05.03.2017 19:41
        +3

        Вот результаты тестирования mysql либ для Node.js по сравнению с PHP — http://mscdex.github.io/node-mysql-benchmarks — думаю теперь вы понимаете, почему PHP быстрее именно в вашем тесте?


        1. MaZaAa
          05.03.2017 20:27

          Все верно, я не знал о существовании этого драйвера. Сейчас обновлю результаты, теперь Node.js впереди!)


          1. ilnuribat
            05.03.2017 20:45
            +6

            все комментарии выше именно про это и говорили(
            Ну вот, теперь осталось Вам понять, как ускорить php))
            На самом деле, чтобы статья стала чуть более «уважаемым», надо добавить результаты профилировщика
            Понять, где эти узкие места

            И сказать, допустим, «вот из-за этой стандартной операции 1+1 php быстрее node»
            или «из-за своей асихнронной модели нода оказалась чуть круче чем php в таких-то и таких-то задачах»
            Это и послужит выводом, потому что сейчас его нет.


          1. surefire
            06.03.2017 10:36
            +3

            А завтра вы узнаете что в PHP есть Постоянные соединения. И он догонит, а потом я вам дам, свой форк mariasql и nodejs будет снова в лидерах.


            А итог такой, ваш тест, тестирует только ваши знания и ничего больше.


  1. akubintsev
    05.03.2017 21:56
    +1

    На пыхе писал, на пыхе пишу, на пыхе и дальше буду писать, пока не понадобится что-то отличное от веб-приложения.


    1. VolCh
      06.03.2017 11:46
      +3

      Веб-сокеты на пхп в продакшене запускали? Какая нагрузка, сколько нод в кластере, утечки памяти мониторите? Пререндеринг на пхп для JS-фреймворков типа ангуляра или библиотек типа реакт как на пхп делаете?


  1. YemSalat
    06.03.2017 09:55
    +4

    По поводу конфигов системы, пхп, Mysql
    У меня настроено так, чтобы работало максимально быстро.
    Если вы не знаете как должна быть настроена операционная система, php, nginx и mysql. Это не моя проблема.

    Несерьезный какой-то подход. А если у вас там запросы кэшируются или еще что? Может вы просто node vs nginx протестировали.
    Залейте конфиг nginx в репозиторий хотя-бы.