Игорь Градов
Игорь Градов
5 мин
ai

Яндекс открыл YaFF для Protobuf: чтение данных в 3,8 раза быстрее FlatBuffers

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

Яндекс открыл YaFF для Protobuf: чтение данных в 3,8 раза быстрее FlatBuffers
Почему это важно

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

Мнение редакции dzen.guru

Яндекс выложил не академическую заготовку, а инструмент, который уже работает в продакшене рекламной системы. Версия 0.1.0 говорит о ранней стадии для внешних пользователей, но внутри компании формат явно обкатан. Мне кажется ценным, что .proto остаётся единственной схемой: это снимает главную боль миграции на FlatBuffers, где приходилось поддерживать две параллельные схемы. Для Protobuf Golang и Python-разработчиков YaFF пока бесполезен, и я бы следил за Issues в репозитории на предмет появления поддержки других языков. Если ваш бэкенд на C++ и Protobuf заметен в профиле CPU, попробовать YaFF на одном горячем пути стоит уже сейчас.

По данным GitHub-репозитория YaFF (Яндекс).

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

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

Комментарии

Читайте также

Graph RAG позволил моделям с 2 млрд параметров решить задачу, которую без графа не решила ни одна
ai

Graph RAG позволил моделям с 2 млрд параметров решить задачу, которую без графа не решила ни одна

Graph RAG (граф знаний для поиска по документам, дополняющий генерацию) позволяет даже компактным моделям с 2-8 миллиардами параметров решать сложные…

8 мин
LLM-конвейер молча теряет записи: три бага, которые не видны в сводке
ai

LLM-конвейер молча теряет записи: три бага, которые не видны в сводке

Конвейеры на базе больших языковых моделей (LLM, от англ. Large Language Model) часто теряют записи так, что итоговые проверки показывают успех, а пользователь…

7 мин
ai

Профи.ру встроил LLM поверх Elasticsearch: 150 000 запросов в час без замены движка

Дмитрий, лид отдела семантики в Профи.ру, рассказал, как команда встроила языковую модель в поиск услуг поверх Elasticsearch, не выбрасывая классический…

6 мин