Если вы наткнулись на эту статью, то вам наверняка интересно, что такое булочка. Вам повезло, так как сейчас я расскажу вам все, что нужно знать о булочке.
Так что же такое Bun? По сути, это новая среда выполнения JS, похожая на Node. Однако, в отличие от Node, Bun безумно быстр. Серьезно, серьезно быстро. Об этом мы поговорим позже, но сначала давайте рассмотрим существующую проблему с Node.
Что не так с Node?
Node существует с 2009 года. С тех пор экосистема веб и серверов сильно изменилась. Многие проблемы Node были освещены создателем, Райаном Далом (в этой конференции). Краткое TL;DR заключается в том, что Node не поддерживает встроенный TypeScript, JSX или переменные среды. Более того, его менеджер пакетов, NPM, известен папкой node_modules
.
Почему он такой быстрый?
Bun построен на Zig, низкоуровневом языке программирования с ручным управлением памятью. Он использует JavaScriptCore Engine, который имеет тенденцию быть немного более производительным, чем V8 Engine от Google.
Bun в основном приписывает свою скорость Zig, заявляя на своем сайте следующее:
Низкоуровневый контроль над памятью и отсутствие скрытых потоков управления в Zig значительно упрощает написание быстрых программ».
Бенчмарки
Джарред Самнер в своем Твиттере сделал множество сравнительных тестов, касающихся скорости работы Bun по сравнению с Node и Deno. Ниже я проведу несколько локальных тестов, чтобы проверить, действительно ли Bun может сравниться с этими другими режимами выполнения. В каждом тесте скрипт просто сохраняет текстовый файл локально. Для проверки скорости я использую Mitata.
Тестирование Bun
// ./scripts/bun.js
import { write } from "bun";
import { bench, run } from "mitata";
const file = "./out/bun.txt";
bench("bun:write", async () => {
await write(file, "hello world");
})
await run();
➜ bench bun ./scripts/bun.js
cpu: Apple M1
runtime: bun 0.1.6 (arm64-darwin)
benchmark time (avg) (min … max) p75 p99 p995
------------------------------------------------- -----------------------------
bun:write 76.86 µs/iter (64.79 µs … 2.35 ms) 75.5 µs 139.38 µs 246.17 µs
Тестирование узла
// ./scripts/node.mjs
import { writeFileSync } from "fs";
import { bench, run } from "mitata";
const file = "./out/node.txt";
bench("node:write", async () => {
writeFileSync(file, "hello world");
})
await run();
➜ bench node ./scripts/node.mjs
cpu: Apple M1
runtime: node v18.7.0 (arm64-darwin)
benchmark time (avg) (min … max) p75 p99 p995
-------------------------------------------------- -----------------------------
node:write 94.55 µs/iter (65.92 µs … 29.59 ms) 78.29 µs 129.25 µs 217.13 µs
Тестирование Deno
// ./scripts/deno.mjs
import { bench, run } from "https://esm.run/mitata";
const file = "./out/deno.txt";
bench("deno:write", async () => {
Deno.writeTextFileSync(file, "hello world");
})
await run();
➜ bench deno run -A ./scripts/deno.mjs
Download https://cdn.jsdelivr.net/npm/fs/+esm
cpu: Apple M1
runtime: deno 1.24.2 (aarch64-apple-darwin)
benchmark time (avg) (min … max) p75 p99 p995
-------------------------------------------------- -----------------------------
deno:write 110.66 µs/iter (74.25 µs … 5.88 ms) 129.79 µs 162.33 µs 179.75 µs
Во всех трех случаях файл был записан в память. Ниже приведена таблица с используемым временем выполнения, используемым родным API и конечной скоростью.
Время выполнения | API | Средняя скорость |
---|---|---|
Bun | Bun.write() | 76.86 мкс |
Узел | fs.writeFileSync | 94.55 мкс |
Deno | Deno.writeTextFileSync | 110.66 мкс |
Как вы можете видеть, Bun явно опережает Node и Deno по количеству операций на стороне сервера. Я говорю «серверные операции», поскольку Bun не так хорошо справляется с клиентскими операциями. В следующем посте я сравню Bun + Next.js с Deno + Fresh.
Также напоминаю, что Bun все еще находится в разработке. То, что вы увидели в этом посте, может потерять актуальность через несколько месяцев. Просто имейте это в виду.
В любом случае, я надеюсь, что вы нашли эту статью полезной 😄.
Пожалуйста, подумайте о том, чтобы поделиться + следующим