Нравится вам это или не нравится, но инструментарий JavaScript снова стал предметом многочисленных разговоров.
Последняя новость: Bun. Новая среда выполнения JS, сфокусированная на производительности и на том, чтобы быть «все в одном» (среда выполнения, бандлер, менеджер пакетов, транспилятор). Считайте это как Node.js, плюс NPM, плюс tsc, плюс rollup — только быстрее.
Он делает большие заявления, например, в 3 раза быстрее при рендеринге React на стороне сервера. Итак, мы проверили это на практике.
Что делает Bun быстрым?
Команда Bun объясняет свою производительность несколькими вещами:
- Тонны времени, потраченного на профилирование, бенчмаркинг и оптимизацию
- Использование языка Zig для низкоуровневого управления памятью и отсутствия скрытого потока управления
- Использование JavaScript Core, движка внутри Safari, вместо V8, движка внутри Chromium.
Итак, быстрее ли он?
Мы решили разобраться в этом конкретном утверждении из Bun.sh:
На первый взгляд, ничего себе! Но потом я представил, что мой сайт на Next.js вдруг стал в 3 раза быстрее… и, честно говоря, не смог это представить.
Но кто знает, поэтому я стал копать дальше. Первое, что бросилось мне в глаза, — это исходный код бенчмарка. Короче говоря… это не самый «жизненный» пример рендеринга приложения React на сервер.
Не знаю, как вы, но каждый раз, когда я выполняю серверный рендеринг React для реального приложения, происходит гораздо больше событий. Гораздо большее дерево компонентов с бизнес-логикой, библиотеками, реквизитами, состоянием, контекстом и т.д.
Поэтому я создал более полноценное приложение React и решил провести несколько бенчмарков.
Методология
Я создал приложение приборной панели в Mitosis (источник). Оно имеет полное дерево компонентов, бизнес-логику, зависимости, использует props и state и другие типичные особенности React.
Mitosis был выбран для того, чтобы мы могли генерировать код для многих фреймворков, чтобы сравнить их производительность в этом более «реальном мире», ориентированном на приложение, а также вариации — например, React vs Preact, CSS vs styled-components и т.д.
Я создал базовое приложение с Node.js, Deno и Bun. Чтобы более точно повторить результаты Bun, обратите внимание, что мы использовали их собственный форк react-dom/server
.
Сначала я хотел избежать этого, но Джарред (создатель Bun) привел хороший довод в пользу того, что реализация react-dom/server
в зависимости от платформы уже есть (например, браузер против ноды) и, вероятно, будет продолжаться. В конечном итоге они намерены включить это в ядро React, так что мы будем с осторожным оптимизмом предполагать, что это не за горами.
Затем мы использовали autocannon для измерения пропускной способности (запросов в секунду) каждого сервера исполнения, выполняющего наше приложение React.
Итак, каковы были результаты?
Запуск на моем 2,6 ГГц 6-ядерном Intel Core i7
, используя Bun версии 0.1.10
, Deno версии 1.25.0
, Node.js версии 16.14.0
дал следующие результаты:
┌─────────┬──────────────────┬─────┬─────┬─────┬───────┬─────────┐
│ (index) │ name │ 1% │ 50% │ 99% │ Avg │ Std Dev │
├─────────┼──────────────────┼─────┼─────┼─────┼───────┼─────────┤
│ 0 │ 'react-ssr-bun' │ 500 │ 669 │ 718 │ 650.8 │ 71.7 │
│ 1 │ 'react-ssr-deno' │ 550 │ 600 │ 630 │ 601 │ 20.89 │
│ 2 │ 'react-ssr-node' │ 267 │ 375 │ 394 │ 366.5 │ 35.04 │
└─────────┴──────────────────┴─────┴─────┴─────┴───────┴─────────┘
Посмотрите полный исходный текст бенчмарков (и дайте мне знать, если вы видите, как можно улучшить методику).
В результате мы видим, что Bun обрабатывает примерно на 75% больше запросов в секунду, чем Node.js, а Deno находится между ними (ближе к Bun, чем к Node).
Должен сказать, я был удивлен. Да, это не в 3 раза быстрее — но на самом деле быстрее с большим отрывом.
Так стоит ли мне теперь переходить на Bun?
Вероятно, нет. В настоящее время он находится в стадии бета-версии и не готов к использованию (многие пользователи сообщают о наличии заметных ошибок). Но, вероятно, стоит обратить на него внимание.
Я должен сказать, что использование Bun CLI, в частности, кажется очень быстрым.
Установка, в частности, происходит настолько быстро, что мне приходится дважды проверять, действительно ли это произошло.
На мой взгляд, это одна из самых интересных областей Bun, учитывая, насколько медленным может быть даже Yarn в моем опыте для средних и больших проектов.
Но это всего лишь результаты и мнение одного человека. А что думаете вы?