Yandex 開源 YaFF:讓 Protobuf 效能逼近原生 C++ 的 Zero-Copy 格式
編輯核心觀點
- ✦YaFF 透過零複製(Zero-Copy)技術優化 Protobuf 序列化,在 Yandex 廣告推薦系統中實現了 10% 至 20% 的 CPU 節省。
- ✦開發者無需更換 .proto 結構定義,即可透過 YaFF 實現比 FlatBuffers 快約 3.8 倍的讀取效能。
- ✦該工具支援分階段導入,允許在關鍵路徑使用 YaFF,並在邊緣節點與標準 Protobuf 進行雙向轉換。

俄羅斯科技巨頭 Yandex 近日宣布將其高性能 C++ 序列化函式庫 YaFF (Yet another Flat Format) 以 Apache 2.0 授權開源。這項技術旨在解決高負載後端系統中,Protobuf 解析過程佔用過多 CPU 資源的痛點。
解決 Protobuf 解析效能瓶頸
在大型後端系統中,Protobuf 的解析過程往往會消耗顯著的 CPU 資源。雖然 Google 推出的 FlatBuffers 提供了零複製(Zero-Copy)選項,但由於其與 Protobuf 在語義上不相容,開發者若要遷移,必須維護兩套獨立的結構定義(Schema)並撰寫額外的轉換層,導致維護成本過高。YaFF 的出現正是為了填補這一空缺:在保留 Protobuf 語義的前提下,實現零複製讀取。
YaFF 並非要取代 Protobuf,而是作為其替代的傳輸格式。開發者依然使用原有的 .proto 檔案作為單一事實來源(Source of Truth),僅改變資料在記憶體中的物理佈局。對於非效能敏感的程式碼,依然可以將格式轉換回標準 Protobuf 訊息。
多種佈局適應不同場景
YaFF 提供了四種記憶體佈局,開發者可根據讀取速度與結構靈活性進行權衡:
- Fixed:適用於固定結構,無標頭,讀取速度最快。
- Flat:具備兩位元組標頭,支援受限的結構演進,適合密集型熱點資料。
- Sparse:透過元資料表存取欄位,適合稀疏結構。
- Dynamic(預設):執行時自動選擇 Flat 或 Sparse 佈局。
根據 Yandex 的基準測試,在 AMD EPYC 7713 處理器上,YaFF 的 Flat 佈局讀取速度達到 9.79 奈秒(ns),比 FlatBuffers 的 37.30 ns 快約 3.8 倍,且僅比原生 C++ 結構(8.14 ns)慢約 1.2 倍。
編譯器最佳化與實際應用
為了克服編譯器在處理指標別名(Alias)時的保守判斷,YaFF 在生成的程式碼中加入了註解,協助編譯器識別重複存取的安全性,從而實現存取鏈的快取。目前,YaFF 已在 Yandex 的廣告推薦系統中投入生產環境,並成功實現了 10% 至 20% 的 CPU 效能提升。此外,該技術也適用於記憶體映射(mmap)索引、搜尋引擎及特徵儲存(Feature Store)等讀取密集型應用。



