JavaScript БЫСТРЕЕ Java? | Сравним Bun vs Node vs Spring Webflux перформанс
Вставка
- Опубліковано 8 чер 2024
- В JS мире только и разговоров что о блэйзингли фаст Bun, новом runtime для языка JavaScript, может ли он победить в производительности Java, которая считается королем нагрузки в мире бэкенда
Сбор средств на бенчмарки с базой: boosty.to/decembrist/single-p...
Код проекта: boosty.to/decembrist/posts/6b...
00:00 - 03:08 Что будем мерить?
03:08 - 12:31 Как будем мерить?
12:31 - Результаты
Лайв канал: / @decembrist-lounge
Поддержать канал/смотреть видео сразу: boosty.to/decembrist
Вконтактик: decembrist_org
Телеграм новости/мемы: t.me/decembristit
Телеграм чат: t.me/DecembristITTV
Инстаграм: / nevornevor
Хотел переиграть и уничтожить Мурыча, и куда это в итоге нас привело?
Интересные результаты! Пропустил трансляцию в телеграм, думал что не увижу, а тут такое!
Побольше бы таких гонок, люблю тачки и девок!
Было бы интересно проверить так ещё голенг
Сделаю уточнение: данный тест больше сравнивает библиотеки libuv и java.nio и (хз что там в Bun) , которые все нативные
Я делал замеры java netty (Linux epoll) и c++ libuv (Linux epoll) они шли прям нога в ногу на похожих тестах. (сравнивал java и c++ (не js) )
по поводу Bun : года 3-4 назад проходил HighLoadCamp от яндекса, и там хитрые умельцы умудрились из epoll выжить максимум за счет хака с DMA но при этом страдала файловая система (если утрировать)(это все было на с или с++).
Я боюсь что Bun пошёл по той же дорожки, чтобы нарисовать красивые графики он хакает epoll за счет блокировки другой периферии . Когда они переболеют этим, графики выровняются.
Резюмирую:
js хорошо умеет перекладывать данные их нетворка в нетворк, (в libuv работа с файлами блокирующая и реализована через тред пулы)
java умеет очень хорошо перекладывать данные из нетворка на диск (kafka тому подтверждение) и как число-дробилка тоже неплоха
с/с++ хороши во всем кроме : менеджмента памяти, защиты памяти, порога входа
Запощу в тг
Bun не использует libuv, у них там своя реализацияна zig
может позже покопаю насчет пропертей, вполне возможно что там есть хитрости для контейнера, но дело скорее всего просто в фреймворках, спринг в сравнении с этими лоно - это монстр который может все и любым удобным способом. вывод у меня этот складывается после посещения самой популярной в интернете страницы где меряются перформансом фреймворков, там в списке на первых местах по соседству с растом есть и java фреймворк от какого-то китайца, точнее как фреймворк, в нем пару классов и методов, обвязка над апи, вот и весь фреймворк, специально пилился под тест видимо) сприн по сравнению с ним в 4 раза медленнее, точно не помню уже. т.е. пока мы запускаем хелловорлд - мы меряем толщину фреймворка, когда запилим реальное приложение, то эта толщина будет малозаметна на общем фоне. ну а так получается, что средний джит компилятор победит хороший, если в первом программа раз в 10 короче на обработку приходит.
как у тебя голос изменился после тестов, аж взгрустнул)
Ещё не смотрел видео, но уже ставлю оцеку 120 пухлешей из 10.
Было полезно посмотреть на графики утилизации cpu с разбивкой по типу user и system, также график использования сетевых портов. За видео спасибо
МУРЫЧ БЫЛ ПРАВ!
🤣🤣🤣
😎
А bun run без "--bun" точно будет работать на bun runtime, а не на ноде?
Досмотрел до результатов. Похоже, что да. Похоже флаг нужен только когда npm script запускаешь
У js нет своего рантайма. Ты говоришь, что js асинхронно реактивный. Но только host среда определяет, как будет выполняться код
Чувак ну я же просил не душнить про ето (
@@DecembristITTV извини, видео интересное
Спасибо, Интересно! Доказали то же что и прошлый тестер. Только уточнить надо было - сколько памяти сожрет джава, на прошлом тесте закрашилось по расходу памяти. И самый сок - надо было добивать сюда php8.1 во там был рекорд раз 20+ объехал всех, и по памяти красавчик.
Загугли "Java vs Node Js. Who is the King. Benchmarking web frameworks" там у автора серия видео сравнений, сравнивает все языки и фреймворки к ним
Bun работает через PM2.
В реальных условиях важна утилизация cpu, памяти и сети. Было бы интересно осветить этот аспект.
И еще как мысль: не факт что проверять на одном ядре правильно
Не знаю как корректно тестировать бан на нескольких ядрах
А Java скомпилирована в Jit или Aot? Вроде как тоже роляет.
Не Aot, Дак я ж ее погрел, должна быть не медленнее чем aot как минимум
aot медленнее прогретого jit, aot лучше только в быстром запуске, т.к не нуждается в прогреве.
Не знал что Цепкало разбирается в реактивном программировании
Не знаю кто такой Цепкало)
@@DecembristITTV ну чел из ПрожекторПерисХилтон
А теперь с native image ;)
Любой каприз за ваши деньги)))))000))
Bun в эксперементальном режиме поддерживает API воркеров (Workers), так что можно создать воркеров по кол-ву ядер и в каждом воркере запустить веб-сервер. Правда, в Java, насколько я знаю, все данные лежат на куче в обертках, и все гоняется через байт-код; а в Bun, при правильно написанном коде - если используется мономорфизация вызовов функций, мы из-за JIT получим эффективный машинный код - так что при таком тесте, когда у нас и логики-то никакой нет, Bun по-любому выиграет. В целом же, поскольку у нас нет логики, то и непонятно, что мы тут тестируем? Сравниваем скорость кода, сгенерированного JIT и байт-кода Java? Но несмотря на бесполезность затеи, было бы интересно взглянуть также на результаты теста для Го и Раста )))
t.me/decembristit/1304
" все данные лежат на куче в обертках, и все гоняется через байт-код" нет, вы не знаете и написали ерунду
@@user-md2fk3jj1e Не стану спорить, я с Джавой не работаю. Но может тогда лучше сразу написать как правильно, то есть не просто сказать, что написал ерунду, а сказать _почему_ сказал ерунду?
@@user-md2fk3jj1e Потому как посмотрел сейчас в интернете, там пишут что таки да, Джавовый код компилируется в байт-код, а затем исполняется на JVM; а данные хранятся в обертках на куче - ну, кроме некоторых атомарных данных, по типу чисел - но предполагаю, что в таком сложном проекте как Спринг он там сам нагенерирует кучу объектов, что будут лежать на куче. Так что хотелось бы услышать, как _на самом деле_ все устроено. Наперед спасибо!
@@AlexanderBorshak коротко не расскажешь, jvm самая навороченная vm из всех, лучше node и т.д. jit компилятор там есть с давних пор, с огромным количеством оптимизаций, умеет инлайнить методы, если в пределах финального “собранного” метода объект не улетает наружу - то легко может класть его поля в стек не создавая экземпляр в хипе. ну и на стеке кстати вы многое не сохраните, его размер не большой, а сильно переживать за хранение в куче не стоит, это не так много ресурсов требует (да и сейчас есть сборщик мусора zgc который не фризит приложение дольше 1 ms). Есть реально другая проблема, которую сейчас пытаются решить - чтобы была локальность размещения данных, как в структурах си, но изменения глобальные и подождать придется еще годик точно (но это не значит что проблема краеугольная и все тормозит из-за нее). конкретно перформарсные проблемы в тесте могут быть связаны с тем, что изначально томкат на котором крутится спринг бут (кстати через конфиг можно поменять на 2 других варианта) делался по классической модели - поток на соединение, ну и логики там точно больше чем в простеньком http сервере как в node. по-хорошему буст даст не реактивщина а виртуальные потоки, которые вышли в релиз в последней версии, но под них еще на сколько знаю идет оптимизация томката. Или сегодня видел, что есть фреймворк helidon - для тех, кому важна скорость и не особо нужен функционал.. в общем тест любопытный, но корректно было бы сравнивать фреймворки с сопоставимым функционалом, а так да, как написали ниже - это скорее тест обвязки интеграции с сетевым кодом и все что вокруг него. По хорошему стоит позапускать с профайлером, чтобы понять где узкое место и что вообще происходит. Но очевидно, что чем больше работы надо будет делать ноде, помимо перекладывания байтов в сокет - тем больше будет у ней проблем
5 лет смотрю как придумывают новые невероятно быстрые языки и фреймворки, а пишут (и пишу) код на джаве. Интересно почему?
Стабильность лучшая скорость на дистанции
Дорого переписывать
На разном пишут. В нашей компании последний год идёт переписывание сервисов с Java и node.js на Rust. Выигрыш в производительности очень значительный.
@@sky4thunder вопрос был риторический, но удачи в этом деле)
@@sky4thunder на rust нужно переучиваться. Хотя он повсеместно отвоевывает. Но его время еще не пришло. Через 2-3 года начнется хайп
раз последний спринг используется и задача на потоке неочем, то правильнее использовать виртуальные потоки. Особенно, если память ограничена
Как использовать виртуальные потоки? Я не умею)
@@DecembristITTV Зависимость: implementation 'org.springframework.boot:spring-boot-starter-web'
В property: spring.threads.virtual.enabled=true
Эх, бедная жабка.... Но смотреть на ее код приятнее
Сделай так про C++ python
Ты серьёзный?
да это будет кайф тем кто смотрит python))))@@ukratitelkisok9726
Странная постановка вопроса. Js работает в некой среде. Вопрос к скорости к среде а не к Js
Никитос, надо мерять пропускную способность и тогда все встанет на свои места)
Пиши как, замерю
Если ты так хочешь смотреть на перфоманс, то используй Java EE, а не Spring. Зачем использовать фреймворк который предоставляет кучу возможностей, которые лежат мёртвым грузом?
Потому что в проде будет именно он, если есть вопросы к его перфомансу, то это не ко мне
имплементация сравнения не соответствует спецификации
В ban нифига нет пока что ни либ ни кластера и половина встроенных функций не работает
Можно перестать распространять ложь о том что JS однопоточный?
Вам поговорить об этом больше не с кем, Я просил не душнить, нет вы пришли все равно
А ге коменты от гоферов?
ты как один поток, отмираешь. смотреть невозможно.