Vercel ускорил WebStreams в 10 раз: как AI-оптимизация попала в Node.js

Команда Vercel добилась десятикратного ускорения WebStreams в Node.js с помощью AI-оптимизации. Это означает, что серверный рендеринг в Next.js стал значительно быстрее, а улучшения уже интегрируются в сам Node.js через пул-реквест от Matteo Collina. Оптимизация затронет всех разработчиков, использу

Vercel ускорил WebStreams в 10 раз: как AI-оптимизация попала в Node.js

Команда Vercel добилась десятикратного ускорения WebStreams в Node.js с помощью AI-оптимизации. Это означает, что серверный рендеринг в Next.js стал значительно быстрее, а улучшения уже интегрируются в сам Node.js через пул-реквест от Matteo Collina. Оптимизация затронет всех разработчиков, использующих потоковые API, и не потребует изменения кода.

Почему WebStreams были узким местом

Когда команда Vercel начала профилировать серверный рендеринг Next.js в начале этого года, в flame-графах снова и снова всплывало одно и то же: WebStreams. Не код приложения, работающий внутри потоков, а сами потоки. Цепочки Promise, выделения объектов на каждый чанк, прыжки по очереди микрозадач. После того как Тео Браун в своих бенчмарках серверного рендеринга показал, сколько вычислительного времени уходит на накладные расходы фреймворка, инженеры Vercel решили выяснить, куда именно уходит это время. Оказалось, значительная его часть — в потоках.

Как выяснилось, у WebStreams есть невероятно полный набор тестов, что делает их идеальным кандидатом для AI-реализации в чисто тест-драйвовом и бенчмарк-ориентированном стиле. Этот пост — о проделанной работе по оптимизации производительности, о том, что мы узнали, и о том, как эта работа уже попадает в сам Node.js через пул-реквест Matteo Collina.

Как Node.js работает с потоками и в чём проблема WebStreams

В Node.js существует два потоковых API. Старый — stream.Readable, stream.Writable, stream.Transform — существует уже более десяти лет и сильно оптимизирован. Данные перемещаются через внутренности C++. Обратное давление — это булево значение. Пайпинг — один вызов функции.

Новый API — это WHATWG Streams: ReadableStream, WritableStream, TransformStream. Это веб-стандарт. Он обеспечивает работу response.body в fetch(), CompressionStream, TextDecoderStream и, всё чаще, серверный рендеринг в таких фреймворках, как Next.js и React.

Веб-стандарт — правильное API для конвергенции. Но на сервере он работает медленнее, чем мог бы. Чтобы понять почему, рассмотрим, что происходит при вызове reader.read() у нативного WebStream в Node.js. Даже если данные уже находятся в буфере: это четыре выделения памяти и один прыжок в микрозадачу, чтобы вернуть данные, которые уже были там. Теперь умножьте это на каждый чанк, проходящий через каждый трансформ в конвейере рендеринга.

Или возьмём pipeTo(). Каждый чанк проходит через полную цепочку Promise: чтение, запись, проверка обратного давления, повтор. Объект результата {value} выделяется на каждое чтение. Распространение ошибок создаёт дополнительные ветки Promise.

Как AI помог переписать WebStreams и добиться 10-кратного ускорения

Команда Vercel взяла существующий набор тестов WHATWG Streams и использовала AI для генерации новой реализации, которая проходит все тесты, но при этом значительно быстрее. Подход был чисто тест-драйвовым: никаких предположений о том, как должен работать поток, только проверка через тесты. AI-модель итеративно улучшала код, пока все тесты не проходились, а бенчмарки не показывали ускорение.

Результат — реализация WebStreams, которая в 10 раз быстрее оригинальной в сценариях серверного рендеринга. Оптимизации включают: устранение лишних выделений объектов, сокращение прыжков по очереди микрозадач, более эффективное управление обратным давлением. Ключевая идея — минимизировать накладные расходы самого потока, чтобы большая часть процессорного времени уходила на полезную работу приложения.

Технические детали оптимизации: что изменилось внутри

Основные изменения коснулись внутренней механики ReadableStream и WritableStream. Вместо того чтобы каждый раз создавать новый объект Promise при чтении, реализация использует пул предварительно выделенных объектов. Это снижает нагрузку на сборщик мусора. Также оптимизирована обработка обратного давления: вместо булева флага используется счётчик, что позволяет точнее управлять потоком данных без лишних проверок.

Для TransformStream изменён механизм передачи данных между входом и выходом: теперь данные передаются напрямую, без промежуточных Promise-цепочек. Это особенно важно для цепочек трансформов, которые часто встречаются в конвейерах рендеринга. В результате один и тот же рендеринг Next.js на тестовом стенде стал выполняться в 10 раз быстрее по времени, затраченному на потоки.

Кого затронет это изменение и как

В первую очередь оптимизация повлияет на разработчиков, использующих Next.js и React для серверного рендеринга. Поскольку WebStreams лежат в основе многих современных фреймворков, ускорение потоков напрямую сокращает время ответа сервера. Для конечных пользователей это означает более быструю загрузку страниц, особенно при динамическом контенте.

Для разработчиков Node.js, которые пишут собственные потоковые обработчики, оптимизация будет полезна при работе с большими объёмами данных. Особенно это актуально для сервисов, обрабатывающих стриминг видео, аудио или больших JSON-массивов. В экосистеме СНГ, где много стартапов используют Next.js для SSR, это может дать заметный прирост производительности без изменения кода.

Что будет дальше: интеграция в Node.js и планы Vercel

Matteo Collina, известный разработчик ядра Node.js, уже подготовил пул-реквест для включения оптимизированной реализации WebStreams в сам Node.js. Если PR будет принят, все пользователи Node.js получат ускорение автоматически после обновления. Vercel также планирует продолжить оптимизацию других частей рантайма с использованием AI-подхода, начиная с других стандартных API, которые имеют полные наборы тестов.

В ближайших планах — оптимизация TextEncoder/TextDecoder и URL-парсера. Команда Vercel также опубликует бенчмарки и инструменты для воспроизведения результатов, чтобы сообщество могло проверить ускорение на своих сценариях.

Итог

Десятикратное ускорение WebStreams — это не просто цифра, а доказательство того, что AI может эффективно оптимизировать низкоуровневый системный код при наличии качественных тестов. Эта работа уже приносит пользу сообществу Node.js и открывает путь к дальнейшим оптимизациям. Разработчикам стоит следить за развитием этой темы, чтобы первыми получить выгоду от ускорения без каких-либо усилий с их стороны.