Разработчик Эмиль Привер решил провести простой HTTP-тест «Go против Rust против Bun против Node», чтобы оценить производительность Bun 1.0.
Привер создал эталонный тест для измерения количества HTTP-вызовов, которые сервер может обработать в секунду. В тесте сравнивается производительность Bun с GO, Rust и Node, поскольку эти языки часто используются веб-разработчиками для аналогичных целей.
Тест проводился как локально, так и на сервере Linode с двумя выделенными ядрами ЦП и 4 ГБ ОЗУ с ОС Debian 11
Все четыре теста были скомпилированы и запущены с использованием следующих команд:
Bun: bun build --minify ./index.ts --outfile benchmark.js && bun run ./benchmark.js;
Rust: cargo build -r && ./taget/release/rust;
GO: go build -o benchmark ./cmd && ./benchmark;
Node: node benchmark.js.
В тесте Привер использовал такие версии сред выполнения:
Rust: rustc 1.74.0-nightly (b4e54c6e3 2023-09-11);
GO: go version go1.21.0 darwin/arm64;
Bun: 1.0.0;
Node: v20.6.1.
Тест проводился со 100 одновременными подключениями, работавшими в течение 1 минуты, и во всех средах выполнения использовалась многопоточность. HTTP-тесты проводились с использованием wrk (HTTP benchmarking tool). Языки программирования в тесте используют встроенный HTTP-сервер, за исключением Rust, который использует Axum и Tokio, поскольку в Rust нет встроенного HTTP-сервера.
Прежде чем показать результаты, Привер пояснил, что задумал этот тест в основном из любопытства, так как хотел посмотреть, существует ли среда выполнения JS, которая могла бы работать почти так же быстро, как Rust и Go. Он не большой поклонник JS в целом, главным образом потому, что ему не нравится писать на этом языке, но он также чувствовал, что не существует среды выполнения JS, которая была бы «достаточно хорошей». По его мнению, в мире JS недавно появился Deno, который кажется немного быстрее, но все ещё недостаточно «достаточно хорош».
Локальные результаты теста (сборка на Rust обрабатывает больше запросов в секунду по сравнению с другими реализациями):
Тестирование JSON локально (задача — сериализовать простую структуру JSON и вернуть её). Тут Rust по-прежнему работает лучше всего, за ним следует Go, затем Bun и, наконец, Node:
Запуск теста в облаке (возврат только simple string):
Тестирование JSON в облаке:
«Приятно видеть, что Bun работает хорошо и, похоже, может конкурировать с Rust и Go по HTTP. Я также очень рад, что теперь есть достойная среда выполнения, которая "делает все это". В отличие от таких языков, как Rust и Go, которые предоставляют менеджеры пакетов, Bun также их предоставляет. Node, с другой стороны, имеет различные менеджеры пакетов (хотя NPM поставляется с Node) и множество разных способов достижения одной и той же цели, где каждый метод быстрее других. Хотя я в целом не большой поклонник написания JavaScript, я с нетерпением жду возможности создать что-нибудь с помощью Bun», — подытожил Привер.
В начале сентября состоялся релиз Bun 1.0 - среды выполнения JavaScript и TypeScript с возможностью отладки кода и поддержкой популярных веб-фрейворков. В Bun работают полнофункциональные приложения, созданные с помощью Next.js, Remix, Nuxt, Astro, SvelteKit, Nest, SolidStart и Vite. Разработчики проекта пояснили, что Bun запускается в 4 раза быстрее, чем Node.js. Эта разница только увеличивается при запуске файла TypeScript, который требует транспиляции, прежде чем Node.js сможет его запустить.