JavaScript превратился в универсальный язык, выходящий за рамки традиционной области веб-разработки. В последние годы его популярность в сфере обработки данных выросла в геометрической прогрессии благодаря его гибкости и простоте использования. Node.js с его событийно-ориентированной архитектурой и неблокирующим вводом-выводом стал идеальной средой выполнения для инженеров данных, когда дело доходит до обработки рабочих нагрузок с интенсивным использованием данных. В архитектурах, управляемых событиями, таких как AWS Lambda, Azure Functions и Google Cloud Functions, Node.js ярко проявил себя благодаря минимальным накладным расходам и пригодности для простых операций, таких как поиск по регулярным выражениям и обогащение данных.

Встречайте Bun: меняющий правила игры в облачных технологиях и разработке данных

Bun, революционная среда выполнения JavaScript, недавно вышла на сцену, обещая изменить подход к решению задач по обработке данных. Он разработан с нуля для удовлетворения потребностей современной экосистемы JavaScript с тремя основными целями: скорость, элегантные API и сплоченный опыт разработчиков.

Бан достигает такой замечательной скорости, опираясь на JavaScriptCore, ориентированный на производительность движок JavaScript, на котором работает Safari. Эта скорость имеет решающее значение, поскольку вычисления все больше смещаются на периферию, где эффективность и скорость реагирования имеют первостепенное значение. В контексте обработки данных, где могут выполняться миллионы и миллиарды небольших функций, такая скорость может привести к существенной экономии времени выполнения, что приведет к снижению затрат и улучшению масштабируемости.

Бенчмаркинг Bun против Node.js: явное преимущество

Чтобы проиллюстрировать преимущество Бана в скорости работы с данными, давайте рассмотрим тест с использованием набора данных Reuters 21578 для категоризации текста (https://archive.ics.uci.edu/dataset/137/reuters+21578+text+categorization+collection). . Мы поручили Бану и Node.js найти в этих данных слово кукуруза и записать совпадения в файл JSON. Тесты включали версию, совместимую с Node.js, которая выполнялась как с Node, так и с Bun, и более оптимизированную версию для Bun, в которой использовались улучшенные функции чтения и записи, встроенные в Bun. Сценарий Node представлен ниже:

const {
  glob,
  globSync,
  globStream,
  globStreamSync,
  Glob,
} = require('glob')
const fs = require('fs');

// data that is being used comes from: https://archive.ics.uci.edu/dataset/137/reuters+21578+text+categorization+collection

function filterbychr(body, match) {
  var regex = match
  return body.match(regex).filter(function (m, i, self) {
    return i == self.indexOf(m)
  }).join('')
}

async function readAndProcess(filepath, match) {
  const text = fs.readFileSync(filepath, 'utf8');
  const matches = filterbychr(text, match)
  return { "file": filepath, "matches": matches }
}

async function processFiles(files, match) {
  let contents = await Promise.all(files.map(async (file) => {
    const contents = await readAndProcess(file, match);
    return contents
  }))
  fs.writeFileSync(`output_node.json`, JSON.stringify(contents));
}

async function runAll() {
  const start = performance.now()
  const files = await glob('datatext/reut**.sgm', { ignore: 'node_modules/**' })
  await processFiles(files, '.*corn.*')
  const end = performance.now()
  console.log("The time it took to run was:", end - start)
}
// actually running the tests
runAll();

Более нативная реализация с операциями чтения и записи Bun:

import { read } from 'fs';
import { glob, globSync, globStream, globStreamSync, Glob } from 'glob'

// data that is being used comes from: https://archive.ics.uci.edu/dataset/137/reuters+21578+text+categorization+collection
const files = await glob('datatext/reut**.sgm', { ignore: 'node_modules/**' })

function filterbychr(body, match) {
  var regex = match
  return body.match(regex).filter(function (m, i, self) {
    return i == self.indexOf(m)
  }).join('')
}

async function readAndProcess(filepath, match) {
  const file = Bun.file(filepath);
  const text = await file.text();
  const matches = filterbychr(text, match)
  return { "file": filepath, "matches": matches }
}

async function processFiles(files, match) {
  let contents = await Promise.all(files.map(async (file) => {
    const contents = await readAndProcess(file, match);
    return contents
  }))
  await Bun.write(`output_bun.json`, JSON.stringify(contents));
}

// actually running the tests
const start = performance.now()
await processFiles(files, '.*corn.*')
const end = performance.now()
console.log("The time it took to run was:", end - start)

Результаты были:

  • Время работы узла: 78,76 мс
  • Бег узла булочки: 18,21 мс
  • Скамейка для булочек: 9,35

Это означает, что в этом примере код Node был оптимизирован за счет использования другой среды выполнения в 4,325 раза, а когда мы адаптируем механизмы загрузки к собственным методам Bun, мы улучшаем время выполнения в 8,425 раза. Эта существенная разница подчеркивает потенциал Буна в значительном повышении производительности при решении задач по обработке данных.

Дополнительные преимущества булочки:

Помимо преимуществ во время выполнения, Bun предлагает несколько привлекательных функций для инженеров данных:

  1. Обратная совместимость. Bun служит полной заменой Node.js и изначально реализует сотни Node.js и веб-API, включая fs, path, Buffer и многое другое. Это означает, что переход на Bun — это простой процесс для команд, уже знакомых с Node.js.
  2. Поддержка TypeScript.Bun поставляется с готовой поддержкой TypeScript, повышающей качество кода и удобство сопровождения, что очень важно в проектах по обработке данных.
  3. Быстрый менеджер пакетов. Bun включает в себя быстрый и эффективный менеджер пакетов, упрощающий управление зависимостями в сложных конвейерах данных.
  4. Jest-совместимый пакет тестирования. Для инженеров данных, которые отдают предпочтение тестированию, Bun обеспечивает совместимость с Jest, широко используемой средой тестирования, гарантируя, что ваш код инженерии данных останется устойчивым и надежным.
  5. Поддержка Docker. Среда выполнения Bun также доступна в качестве необходимого Docker-контейнера, который управляется и обслуживается организацией Bun.sh (https://hub.docker.com/r/oven/bun )
  6. Поддержка CI:Bun.sh также предоставляет готовые действия Github для интеграции в ваши конвейеры CI/CD. Для получения дополнительной информации просмотрите репозиторий: https://bun.sh/guides/runtime/cicd.

Заключение: блестящее будущее для инженерии данных с Bun

В постоянно развивающемся мире обработки данных Бун меняет правила игры. Его замечательная скорость, совместимость с существующими экосистемами Node.js, поддержка TypeScript и удобные для разработчиков функции делают его привлекательным выбором для инженеров по обработке данных, стремящихся оптимизировать свои рабочие процессы, снизить затраты и повысить масштабируемость. Благодаря своей недавней стабильной версии (v1.0) Bun теперь является действительно жизнеспособным кандидатом на замену Node.js в наборе инструментов для инженерии данных. Поскольку приложения, управляемые данными, продолжают распространяться, Бун готов сыграть ключевую роль в формировании будущего обработки данных с помощью JavaScript.

Источники: