Игорь Градов
Игорь Градов
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».

Комментарии

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

Минторг США обвинил ASML в утечке чипов в Китай, но не показал доказательств
ai

Минторг США обвинил ASML в утечке чипов в Китай, но не показал доказательств

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

5 мин
Midjourney строит сканер тела на 500 000 датчиков, а генератор картинок открыла бесплатно
ai

Midjourney строит сканер тела на 500 000 датчиков, а генератор картинок открыла бесплатно

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

5 мин
США обязали Anthropic Claude отозвать две модели: найден обход защиты
ai

США обязали Anthropic Claude отозвать две модели: найден обход защиты

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

4 мин