Яндекс открыл YaFF для Protobuf: чтение данных в 3,8 раза быстрее FlatBuffers
Яндекс в начале июня выложил в открытый доступ YaFF (Yet another Flat Format), собственный формат сериализации для Protobuf, который на внутренних бенчмарках читает данные в 3,8 раза быстрее, чем FlatBuffers от Google, и экономит компании 10-20% процессорных ресурсов в продакшене.

Protobuf остаётся стандартом обмена данными в высоконагруженных сервисах, но его разбор способен съедать двузначный процент мощности процессоров на бэкенде. Яндекс показал конкретную экономию на собственной рекламной рекомендательной системе и отдал решение сообществу под лицензией Apache 2.0.
До сих пор единственной распространённой альтернативой для тех, кому Protobuf тормозил, был FlatBuffers. Но у него своя схема, свои правила и несовместимый формат, а значит, миграция требовала переписывания конвертеров вручную. YaFF закрывает именно этот разрыв: формат работает поверх стандартных .proto-файлов и не требует отказа от Protobuf, а значит, внедрять его можно модуль за модулем. О выпуске Яндекс сообщил на GitHub, текущая версия 0.1.0, библиотека написана на C++.
| Показатель | Значение | Источник |
|---|---|---|
| Скорость чтения Flat Layout | 9,79 нс (наносекунд на операцию) | Бенчмарк Яндекса, AMD EPYC 7713, Clang 20.1.8 |
| Скорость чтения FlatBuffers | 37,30 нс | Тот же бенчмарк |
| Скорость чтения Protobuf | 219,35 нс | Тот же бенчмарк |
| Сырая структура C++ (базовая линия) | 8,14 нс | Тот же бенчмарк |
| Разница Flat Layout и FlatBuffers | примерно в 3,8 раза быстрее | Тот же бенчмарк |
| Разница Flat Layout и сырой структуры | в пределах 1,2 раза | Тот же бенчмарк |
| Экономия CPU в продакшене | 10-20% | Яндекс, рекламная рекомендательная система |
| Лицензия | Apache 2.0 | GitHub-репозиторий YaFF |
| Текущая версия | 0.1.0 | GitHub-репозиторий YaFF |
Что именно сделали?
Сериализация (превращение структуры данных в поток байтов для хранения или передачи) в Protobuf устроена так: сервис получает сообщение, разбирает его, создаёт объект в памяти, и только потом может читать поля. На один разбор уходят доли микросекунды, но когда таких операций миллиарды в сутки, процессоры тратят ощутимую долю времени только на парсинг.
Формат с нулевым копированием (zero-copy) работает иначе: данные лежат в буфере ровно так, как их будут читать, поэтому этап разбора пропускается. Поле читается прямо из буфера, как если бы вы открыли нужную страницу книги, а не переписывали её в тетрадь.
YaFF предлагает четыре варианта раскладки данных в памяти:
- Fixed (фиксированная): данные упакованы плотно, без заголовков, схема заморожена. Максимальная скорость, но нельзя менять набор полей.
- Flat (плоская): добавляет двухбайтовый заголовок и позволяет эволюцию схемы, то есть добавление новых полей без поломки старого кода.
- Sparse (разреженная): адресует поля через мета-таблицу, подходит для схем, где заполнена лишь часть полей.
- Dynamic (динамическая, по умолчанию): автоматически выбирает Flat или Sparse в зависимости от того, позволяет ли текущая схема плоскую раскладку.
Главная идея: .proto-файл остаётся единственным источником правды. YaFF меняет только физическое расположение данных в памяти, а программный интерфейс остаётся похожим на стандартный Protobuf.
Что показали бенчмарки?
Яндекс опубликовал воспроизводимый набор тестов на базе google/benchmark. Замеры выполнены на процессоре AMD EPYC 7713, компилятор Clang 20.1.8, сборка Release. Ключевые результаты на иерархическом сценарии чтения:
- Flat Layout YaFF: 9,79 нс на операцию чтения.
- FlatBuffers: 37,30 нс, то есть в 3,8 раза медленнее.
- Стандартный Protobuf: 219,35 нс, в 22 раза медленнее.
- Сырая структура C++ без всяких форматов: 8,14 нс. YaFF отстаёт от неё всего в 1,2 раза.
Яндекс отдельно оговаривает: абсолютные числа зависят от процессора и памяти, но соотношение между форматами должно сохраняться на другом оборудовании.
Кроме скорости, YaFF решает техническую проблему компиляторной оптимизации. И FlatBuffers, и YaFF читают поля, интерпретируя сырую память как нужный тип. Компилятор LLVM при этом не может доказать, что повторные обращения к одному полю безопасно кэшировать, и перечитывает цепочку доступа заново. YaFF добавляет в сгенерированный код аннотации, которые помогают компилятору переиспользовать результат, если между чтениями память не менялась.
В продакшене Яндекс использует YaFF в рекламной рекомендательной системе. По данным компании, это даёт 10-20% экономии процессорного времени.
Бенчмарк выполнен самим Яндексом, на одном процессоре, в одном иерархическом сценарии. Независимых сторонних замеров пока нет. Версия 0.1.0 означает раннюю стадию: API может меняться. Библиотека доступна только на C++, поддержки Protobuf Golang или других языков на момент публикации не объявлено. Цифра 10-20% CPU получена на конкретной рекламной системе Яндекса и может не воспроизводиться на других нагрузках.
Что это значит для вас?
Для тех, кто работает с контентом и ИИ в России, эта новость интересна с нескольких сторон.
Разработчикам на C++, которые используют Protobuf в высоконагруженных сервисах, YaFF даёт способ ускорить чтение данных без полной миграции. Достаточно подключить формат в одном критичном участке кода, а на границах оставить двустороннюю конвертацию в Protobuf. Подключение идёт через CMake или Conan.
Тем, кто работает с Protobuf Golang или другими языками, пока не повезло: YaFF существует только для C++. Но сам подход (альтернативный формат хранения поверх .proto-схем) может появиться и для других экосистем, если сообщество подхватит проект.
Авторам Дзена и маркетологам новость показывает, как российские компании решают инженерные задачи, которые напрямую влияют на скорость и стоимость рекомендаций. Рекламная система Яндекса обслуживает показы на Дзене, в Поиске и Директе, а экономия 10-20% процессоров на этом масштабе означает либо экономию на серверах, либо ресурс для более сложных моделей ранжирования.
Яндекс выложил не академическую заготовку, а инструмент, который уже работает в продакшене рекламной системы. Версия 0.1.0 говорит о ранней стадии для внешних пользователей, но внутри компании формат явно обкатан. Мне кажется ценным, что .proto остаётся единственной схемой: это снимает главную боль миграции на FlatBuffers, где приходилось поддерживать две параллельные схемы. Для Protobuf Golang и Python-разработчиков YaFF пока бесполезен, и я бы следил за Issues в репозитории на предмет появления поддержки других языков. Если ваш бэкенд на C++ и Protobuf заметен в профиле CPU, попробовать YaFF на одном горячем пути стоит уже сейчас.
По данным GitHub-репозитория YaFF (Яндекс).

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».
Читайте также

Минторг США обвинил ASML в утечке чипов в Китай, но не показал доказательств
Компания ASML (производитель литографического оборудования, без которого невозможно выпускать самые передовые чипы в мире) оказалась в центре конфликта с…

Midjourney строит сканер тела на 500 000 датчиков, а генератор картинок открыла бесплатно
Midjourney, компания, которую знают по генерации картинок, 4 июня 2025 года объявила о запуске медицинского сканера тела, работающего на ультразвуке и…

США обязали Anthropic Claude отозвать две модели: найден обход защиты
Правительство США на прошлой неделе обязало компанию Anthropic отозвать две новейшие модели, Claude by Anthropic, Fable 5 и Mythos 5, сославшись на угрозу…
Комментарии