Всем доброго времени суток!


В этом году с выходом Flutter — фреймворка для кроссплатформенной разработки приложений наметился подъем хайпа по языку Dart. Как и любой перфекционист прокрастинирующий от скуки лентяй я задумался о сравнении производительности серверной реализации виртуальной машины Dart с ее потенциальным антагонистом в лице Node.js. Скажу сразу, что во мне теплилась надежда что Dart победит, а я обрету святой грааль дарующий мне превосходство над потенциальными конкурентами на ближайшие пару тройку пятилеток, но реальность оказалось немного иной...


Инструментарий


  • Тестовая машина: Core I7, SSD, 12GB ОЗУ ( любезно предоставленная моим прошлым работодателем )
  • Нагрузочное тестирование: k6.io ( кстати очень интересный по своей архитектуре фреймворк )

Организация кода приложений


Исходники


Тут я особо решил не заморачиваться и решил следовать рекомендациям, которые вычитывал в свое время на Хабре. В частности:


  • Добавил полезную нагрузку в качестве работы по генерации рандомных данных ( рандомных, чтобы исключить потенциальное кеширование результатов )

    class Human {
        constructor (id, name, surname, age, gender) {
            this.id = id
            this.name = name
            this.surname = surname
            this.age = age
            this.gender = gender
        }
    }

  • Как в Dart так и в Node.js использовал варианты синхронной и асинхронной обработки запроса.
  • Применил варианты нативных решений и варианты решений на отраслевых фреймворках (aqueduct for dart и express for node.js)
  • Так как в ходе исследования удалось получить существенное ускорение работы Dart при использовании aqueduct, который запускает изоляты на каждом ядре, то для целей уравновешивания применил модуль cluster для node.js

Методика тестирования


  • запускал нагрузочные тесты с заданным числом запросов в секунду (500, 750) и ограничением на количество итераций теста (количество завершенных запросов)
  • как приложение так и тестирующий фреймворк были запущены на одной машине, соответственно стоит понимать, что все результаты являются относительными и могут быть сравнимы только друг с другом

Результаты


Native Dart


500 rps



750 rps


  • http_reqs: 309.10154/s

Aqueduct framework for Dart


500 rps



750 rps



Native Node.js


500 rps



750 rps



Node Express with Cluster


500 rps



750 rps



Выводы


  • Конечно многое зависит от того как Вы реализовали логику приложения, я не особо уверен, что мой код является оптимальным как в случае dart так и node.js
    • В частности функцию генерации массива можно было вывести в отдельный worker поток с асинхронным выводом, в моем случае это не было реализовано, поэтому здесь на самом деле не использована вся мошь асинхронщины
    • Как в Dart так и в Node.js вывод можно было организовать через поток
    • Поэтому здесь еще много места как для исследования производительности, так и для оптимизаций
  • Dart в нативной реализации хендлеров показал эпичейский фейл, тем не менее при реализации через фреймворк показал впечатляющие результаты, согласно которым виртуальная машина Dart уже сейчас может составить конкуренцию Node.js
  • На сколько я знаю, в оптимизацию работы V8 вложено колоссальное количество человеко-часов труда, я более чем уверен, что в виртуальную машину Dart вложено гораздо меньше времени. Поэтому у второй возможно есть достаточно больший потенциал для оптимизаций перед V8

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


  1. jevius
    02.01.2019 22:45
    -6

    > Dart
    Очередное не нужное УГ.


    1. ogregor Автор
      02.01.2019 23:13
      +1

      Я пробовал Flutter, по производительности он рвет React Native в клочья. Так что у Dart есть определённые перспективы.


      1. jevius
        02.01.2019 23:16
        -4

        Зачем улучшать то (RN), чего изначально не должно было существовать?


        1. ogregor Автор
          02.01.2019 23:23
          +1

          Затем что доля заказов на кросплатформу растёт. А RN это боль. Поэтому надо заказчиков мягко переключить на Flutter.
          Если рассматривать в контексте веб-сервера. То скорее всего для того чтобы исключить TS, Flow, транспиляцию, и использовать строготипизированый нативно язык на архитектуре неблокирующего эвент лупа


          1. jevius
            02.01.2019 23:31
            -2

            Это не вопрос, а претензия к фреймворку.

            Цукерберг — бизнесмен в первую очередь. Он делает все для оптимизации бизнеса. Но это не значит что он делает правильные вещи.

            P. S.: редактировать комментарии искажая изначальный смысл — не надо так. Дописали бы через UPD.

            UPD: кроссплатформа на мобильных точно не нужна. Это даже не обсуждается. Точка.


            1. ogregor Автор
              02.01.2019 23:41

              Спасибо за замечание. Учту.
              На сколько я знаю, в последнее время ходят слухи об ос Фуксия, которая на Dart и Flutter, если это так и она взлетит как приёмница Android, то это уже будет стандарт под мобилы, по крайней мере от Google. Я вот сани летом готовлю.

              UDP: А если он (Flutter) ещё и будет из коробки поддерживать портирование под Яблоко, Линукс и Винду, то я лично рад буду только и скорее всего со мной будут радоваться ещё много тысяч заказчиков, которые оплачивают весь этот праздник жизни


              1. jevius
                02.01.2019 23:56
                -2

                Вы видели приложение Яндекс Карт? Оно на RN. И оно ужасно

                Портировать Java код под iOS можно и сейчас, например (см. J2ObjC).


                1. ogregor Автор
                  03.01.2019 00:33
                  +2

                  — Вы почитайте про Flutter, он предлагает готовые библиотеки компонентов Material Design и Cupertino. Практически пиксель перфект и физикой оригинала
                  — Основная проблема RN это bridge из за чего возникают проблемы с производительностью при чехарде данными между js движком и нативом, Flutter устроен иначе. Поставщики предлагают 100% аналоги UI при рендере на стороне фреймворка.
                  — В последнее время стало выходить много интересных приложений от исследователей Flutter и я был поражён его гибкостью. «Всё что угодно» — это можно назвать так.
                  — Писать в 2019 году на Objective C уже не кашерно


                  1. Karloid
                    03.01.2019 10:53

                    > Поставщики предлагают 100% аналоги UI
                    утверждение которое вводит в заблуждение.
                    в флаттере не 100% аналоги виджетов UI, к примеру в ios клавиатура уходит вместе с VC в NavigationController, в флаттере нет.
                    Насчет 100% замены iOS блюров тоже терзают сильные сомнения, беглым поиском не iOS приложения/демо с блюром что бы сравнить с нативным.
                    (если там тоже самое что и в андроидовском демо с cupertino, то это ужас и кошмар)


                    1. ogregor Автор
                      03.01.2019 10:57

                      Да, иногда Остапа сильно несёт. Но в любом случае, судя по тому как это реализуется, то тут вопрос больше в количестве времени которое могут выделить разработчикам на приведение UI в соответствие нативу


            1. D01
              03.01.2019 14:19

              Кому не нужно это, если только Вам? Я пишу на Ionic и это востребовано.


      1. shandy
        03.01.2019 11:57

        А если сравнить с NativeScript? У него другой механизм, чем у RN.


  1. rfq
    03.01.2019 13:22

    «в оптимизацию работы V8 вложено колоссальное количество человеко-часов „

    Создатель V8 Lars Bak работает на Гугл с 2004 года, так что команде Dart не надо было изобретать велосипед и вкладывать в Dart столько же усилий, как в V8.

    А бенчмарки это дело такое, все они меряют что-то свое. Если мерить задержку и пропускную способность асинхронной обработки сетевых запросов, то Dart заметно быстрее — mrekucci.blogspot.com/2014/09/asynchronous-io-micro-war.html (но Netty все равно лучше).


    1. AlexTheLost
      03.01.2019 14:18

      Прикол в том что эти тесты на 500 или боже упаси 1000+ rpc, вычурные, у 99% проектов(это ещё мягкие оценки) такой загрузки не будет. Даже у stackexchange в пике 450 запросов в секунду.) https://stackexchange.com/performance.
      Проект скорее упрется в кривую логику и алгоритмическую сложность или в запросы к бд или другие узкие места. А мерять запрос-ответ в вакууме это ни очем, есть ещё куча других моментов.


      1. andreylartsev
        04.01.2019 12:19

        Stackexchange при всём уважении, наверное не самый популярный сайт в мире, все же целевая аудитория узковата (и никаких котиков)))). С точки зрения нагрузки надо смотреть на сайты типа google.com, Amazon.com, Facebook.com или отечественные vk.com, mail.ru )


        1. AlexTheLost
          04.01.2019 13:59

          Перечисленное вами как раз попадает в оставшийся один процент. Я хотел донести мысль что тестировать язык или платформу на поглощаемое кол-во запросов секунду это не тот параметр на который нужно обращать внимание. До размеров stackexchange нужно хотя бы дорасти.) А у них нагрузки как видно долеки даже до 500 rps. Там и решения можно применить специфические. А в 99% проблемы будут в других частях.


  1. Karloid
    04.01.2019 14:48

    Собственные бенчмарки это конечно весело, но можно посмотреть\законтрибьютить в www.techempower.com/benchmarks/#section=data-r17&hw=ph&test=plaintext&l=zih7jz-1


    1. ogregor Автор
      05.01.2019 01:10

      У многих проггеров страсть к велосипедам собранным ими самими. Я с этим борюсь, но не всегда получается. Плюс это возможность изучить новый инструментарий. K6.io мне подкинул интересную идею, о том что в качестве фронта для программиста может быть использован JS а бека Go, решение получилось очень производительным.


  1. vn_sten
    04.01.2019 16:51
    +1

    Интересно. Было бы еще интересно взглянуть на сравнения с php+веб сервер и golang


    1. ogregor Автор
      04.01.2019 16:52

      На а этот счёт есть статья от ребят из mail.ru мы же можем сделать вывод относительно Node.js. Golang естественно будет наиболее производительней. На стороне бека я бы за него топил. Но толко в там где появляются узкие места (привет микросервисная архитектура), так как простой прокси на СУБД можно реализовывать на чем то попроще


      1. humbug
        04.01.2019 20:17
        +2

        А вы читали, как ребята из mail.ru опозорились в своих бенчмарках?


        1. ogregor Автор
          04.01.2019 18:04

          Интересно. Но если разбираться до конца то важно учитывать не только производительность. Для меня важным является то сколько потребляет процесс ( в случае node и Go эта разница составляет 10 раз),
          Плюс это наличие библиотек. К примеру недавно уперлись в то что либа под Go не может стилизовать графики Excel. Не знаю как под node но нам пришлось или отказать заказчику в этом требовании или после формирования отчёта, его распаковывать и ручками по регулярке править xml. Вобщем запрос висит на хабе (расширение либы) но из за нас никто это делать не будет, да и мы не хотим тратить на решение этой задачи месяц работы


  1. springimport
    04.01.2019 18:08

    Уточните какой i7. Ведь 2600k в ~3 раза слабее 8700k.


    1. ogregor Автор
      04.01.2019 18:55

      Затрудняюсь, я уже там не работаю. Хотя в статье есть пометка, что тест относительный. Поэтому никакой разницы, что за проц нет. Шина и проц перегружены тестовым фреймворком который запускает по 500-750 http соединений единомоментно


    1. youlose
      04.01.2019 19:31

      У 8700k в 1.5 раза больше ядер(6 против 4), и по тестам он в среднем процентов на 30% (на треть, не в три раза) быстрее. Может быть поделитесь в каких задачах он в 3 раза быстрее?


      1. springimport
        04.01.2019 19:44

        Intel Core i7-2600K vs. Intel Core i7-8700K

        Cinebench R15 (Single-Core)
        128 (62%) vs 208 (100%)

        Cinebench R15 (Multi-Core)
        612 (42%) vs 1447 (100%)

        В однопотоке разница на треть да, в многопотоке в 2.3 раза. Это не учитывая разгона, в нем однопоток становится быстрее в ~1.7 раз, многопоток в 2.7.


        1. bvbr
          04.01.2019 18:30

          Во первых разгонять сервера как-то не принято.
          Во вторых 3х раз все равно нет.
          В третьих рендер в сайнбенче — сугубо расчетная задача нагружающая только цпу, а вебсервер в основном занимается вводом-выводом, так сравнивать вообще некорректно


          1. springimport
            04.01.2019 18:34

            Вы читали мое сообщение? Там написан вопрос про модель i7. Какие еще сервера?
            3 раз нет, есть почти 3 раза.

            Тестировал я как-то приложение на процессоре 2.4ггц и 3.6. Разница была видна даже на глаз. Поэтому частота очень решает.


            1. bvbr
              04.01.2019 19:07

              Конечно прочитал,
              Сервера при том что обсуждается серверное программное обеспечение,
              разница между производительностью i7 первого и последнего поколения относительно не большая, и становится «в разы» только там, где софт может эффективно использовать добавившиеся ядра или новые наборы инструкций, что в случае веб-сервера актуально далеко не всегда

              вам примерно об этом написали в 2х комментариях, а Вы зачем-то начали приводить результаты сайнбенча и разгон, хотя это в данном случае не релевантно.


              1. springimport
                04.01.2019 19:26

                Мне вообще была интересна модель i7. Вы опять начинаете про сервера.
                Между первым i7 и последним — пропасть. Причем в однопотоке и многопотоке.
                Вы видимо думаете что главное чем отличаются процессоры — количеством ядер, но нет. В первую очередь их отличает качество ядер.


                1. bvbr
                  04.01.2019 19:28

                  Сможете эту «пропасть» охарактеризовать в числах?


                  1. springimport
                    04.01.2019 20:09

                    Пару сравнений:

                    Заголовок спойлера
                    1. bvbr
                      04.01.2019 21:48

                      И? Где пропасть то? (реальная пропасть есть, но она отнюдь не в производительности)

                      прогресс примерно в 2 раза за 8 поколений и почти 9 лет,
                      а значимые скачки, как и написал выше, или кол-во ядер или новые инструкции.
                      если еще нормировать на частоту, то прогресс на каждом поколении придется под микроскопом искать

                      Напомню, мы с вами в топике бенчмарка http сервера, для которого «числодробительная» мощь проца — далеко не на первых местах по важности, и сравниваются 2 разные программы, а не разное железо

                      а если уж совсем отойти от темы и по сравнивать теплое с мягким
                      то можете оценить прогресс от первого до предпоследнего поколения Core в вот этом видео www.youtube.com/watch?v=Viq1bSJHyAM


                      1. springimport
                        04.01.2019 22:04

                        На безрыбье и рак — рыба. Процессоры могли бы расти как видеокарты, но видимо что-то мешает этому. Вы видимо сравниваете с таким ростом, желая роста 100% в год))
                        В реальности разница в 10% в однопотоке — уже супер, не говоря уже о 100%. Более того, выпусти интел завтра i7-9900k-v2 с 6ггц, фанаты его раскупят даже за $1000 потому что 10% в процессорах = 100% в видеокартах.

                        Что до многопоточности, Интел без конкуренции придерживала ядра, сейчас же прогресс возобновился. Если амд 9 числа анонсирует 12/16 ядер (я сомневаюсь в этом, но все же), то старые i7 станут сегодняшними пеньками.


                        1. bvbr
                          04.01.2019 22:41

                          Вы видимо сравниваете с таким ростом, желая роста 100% в год))

                          Я пишу о том что ваши «3 раза» далеки от реальности и в данном топике вообще бессмысленны

                          10% в процессорах = 100% в видеокартах.

                          тоже крайне спорное утверждение

                          разница в 10% в однопотоке — уже супер
                          — с этим соглашусь
                          серьезных подвижек без смены архитектуры мы пока не увидим


                          1. springimport
                            04.01.2019 23:10

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


                            1. bvbr
                              05.01.2019 00:30

                              а правильного ответа нет)))
                              результат будет зависеть от того что мерить, как мерить, где в данных условиях узкое место и еще множества других факторов.

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

                              Задействование AES-NI может заставить хилый Atom быть в разы производительней на операциях шифрования по сравнению с гораздо более мощными CPU где AES-NI отсутствует или не включен
                              AVX может ускорять работу с видео потоками

                              сам вопрос

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


                      1. firedragon
                        05.01.2019 08:45

                        Поддержу вас. У меня трудится рабочая станция HP Z420. Каких то глобальных различий не видно. Самое смешное что я специально заменил xeon e5 1620 -> xeon e5 2680 v2 нужно было больше ядер для виртуалок.

                        springimport
                        Мегагерцы не решают. Подбирайте сбалансированную конфигурацию и будет вам счастье.