Что такое булочка?

Если вы наткнулись на эту статью, то вам наверняка интересно, что такое булочка. Вам повезло, так как сейчас я расскажу вам все, что нужно знать о булочке.

Так что же такое 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 все еще находится в разработке. То, что вы увидели в этом посте, может потерять актуальность через несколько месяцев. Просто имейте это в виду.

В любом случае, я надеюсь, что вы нашли эту статью полезной 😄.

Пожалуйста, подумайте о том, чтобы поделиться + следующим

Оцените статью
devanswers.ru
Добавить комментарий