Telegram Web Link
Behind The Scenes of Bun Install

Статья от Bun про то, как они оптимизировали установку npm-пакетов - в 7 раз быстрее npm, в 4 раза быстрее pnpm, в 17 раз быстрее чем yarn.

Статья хороша т.к. решение bun быстрое не на уровне алгоритмов, а на уровне правильного использования API операционки.

Одна из проблем - npm использует nodejs API для доступа к файловой системе. Это порождает 2 проблемы:
1. Эти операции проходят через очередь событий nodejs/libuv
2. Эти операции требуют перхода из user mode в kernel mode, т.е. операционка переключает контекст исполнения команды, что достаточно затратно (в статье приводится цена в 500 наносекунд для одного такого обращения для процессора с частотой 3ГГц)

Решение от bun - написали свое решение для доступа к файловой системе на zig и оптимизировали системные вызовы доступа к файлам. Там где yarn делает 4 миллиона системных вызовов, bun делает 165 тысяч.

Кроме самой установки пакетов bun также оптимизировал копирование закешированных пакетов в проект. Для разных ОС сделаны разные решения, гарантирующие быстрое копирование пакетов

Кроме этого, bun оптимизировали DNS-запросы. В npm запросы делают через nodejs API, что приводит к использованию очереди в libuv. Bun напрямую используют возможности ОС

Другая оптимизция - bun трансформирует package.json пакетов в бинарные данные, которые значительно ускоряют доступ к информации в package.json. Парсинг JSON достаточно хорошо оптимизирован современными инструментами, но он все равно медленее работы с бинарными данными.

Следующая оптимизация затрагивает скачку архивов. Обычно пакетные менеджеры скачивают архив с пакетом и на лету его извлекают. Т.к. итоговый объем распакованных файлов неизвестен, то пакетным менеджерам приходится алоцировать доп память, если извлеченные данные оказываются больше, чем ожидалось. Bun, вместо этого, скачивает полностью tarball, в конце tarball находится информация, показывающая сколько места занимают извлеченные данные, bun их считывает и аллоцирует необходимое пространство на диске.

Далее идет оптимизация, достаточно сложная - bun оптимизирует доступ к дереву зависимостей для CPU. Если хранить дерево как обычно, то CPU часто будет попадать мимо своих кешей и ходить в ОЗУ. Bun хранит дерево зависимостей в хитрых массивах, что оптимально для CPU-кеширования. Я, наверное, не справлюсь с правильным объяснением - лучше почитать самому.

https://bun.com/blog/behind-the-scenes-of-bun-install

#development #javascript #bun #npm #packageManagers
🔥20
2025/10/01 09:29:21
Back to Top
HTML Embed Code: