星標公眾號,讓嵌入式知識 “投喂” 不停歇!
cpp-serializers 是一個專注于 C++ 序列化庫性能基準測試

https://github.com/thekvs/cpp-serializers
在嵌入式系統、高性能計算、分布式通信等場景中,序列化方案的選擇直接影響系統的吞吐量、內存占用和通信效率,而本項目通過對 9 種主流序列化庫進行橫向對比,揭示了不同編碼方案在數據體積和序列化速度上的顯著差異,為工程師提供了基于實測數據的決策依據。
自動化依賴管理通過 CMake ExternalProject 模塊自動下載并編譯所有序列化庫(Boost、Thrift、Protobuf 等),開發者無需手動配置復雜的環境依賴,只需執行標準構建流程即可獲得完整的測試環境。
靈活的測試控制支持通過命令行參數精確指定測試迭代次數、選擇特定序列化庫、輸出 CSV 格式數據,便于集成到 CI/CD 流程或批量對比實驗中。
統一的測試數據使用預定義的 300+ 個 int64 整數和 100 個固定長度字符串作為測試負載,確保所有序列化庫在相同的數據條件下競爭,消除數據差異帶來的偏差。
多維度的性能指標同時測量序列化后的數據體積和序列化+反序列化的總耗時,幫助開發者根據實際場景權衡空間效率和時間效率。
項目采用清晰的分層架構設計,將測試框架、數據定義、序列化實現和構建系統分離,既保證了代碼的可維護性,也方便擴展新的序列化庫。以下架構圖展示了各模塊之間的關系和數據流轉過程:

測試框架層負責協調整個基準測試流程,測試數據層提供標準化的輸入數據,序列化實現層包含各種序列化庫的具體實現,IDL 定義層存儲各序列化方案的接口定義文件。箭頭表示數據流轉方向,虛線表示代碼生成關系。
項目的目錄組織遵循職責分離原則,每個子目錄對應一種序列化庫的實現或工具鏈,便于開發者定位特定庫的源代碼和配置文件。根目錄下的 IDL 文件定義了統一的測試數據結構,各序列化庫必須實現相同的語義才能保證測試的公平性:
cpp-serializers/
├── benchmark.cpp # 基準測試主程序
├── data.hpp # 測試數據定義
├── CMakeLists.txt # 構建系統配置
├── test.proto # Protobuf IDL定義
├── test.thrift # Thrift IDL定義
├── test.fbs # FlatBuffers Schema定義
├── test.capnp # Cap'n Proto Schema定義
├── protobuf/ # Protobuf生成代碼
│ ├── test.pb.cc
│ └── test.pb.h
├── thrift/ # Thrift生成代碼
│ └── gen-cpp/
├── flatbuffers/ # FlatBuffers生成代碼
│ └── test_generated.h
├── capnproto/ # Cap'n Proto生成代碼
│ ├── test.capnp.c++
│ └── test.capnp.h
├── boost/ # Boost序列化實現
│ ├── record.hpp
│ └── record.cpp
├── cereal/ # Cereal序列化實現
│ ├── record.hpp
│ └── record.cpp
├── yas/ # YAS序列化實現
│ ├── record.hpp
│ └── record.cpp
├── msgpack/ # Msgpack序列化實現
│ └── record.hpp
├── avro/ # Avro序列化實現
│ └── record.hpp
└── images/ # 性能測試結果圖表
├── size.png
├── time.png
└── time2.png
目錄說明: 帶 test.* 前綴的文件是各序列化庫的接口定義語言文件,用于生成類型安全的序列化代碼。各庫的實現目錄中,header-only 庫(如 YAS、Msgpack)僅需 .hpp 文件,而需要編譯的庫(如 Boost、Cereal)則包含 .cpp 實現文件。
支持的序列化器列表:
thrift-binary | |||
thrift-compact | |||
protobuf | |||
boost | |||
msgpack | |||
cereal | |||
avro | |||
capnproto | |||
flatbuffers | |||
yas | |||
yas-compact |
項目當前支持 9 種主流序列化庫,根據其編碼原理可以分為四大類:TLV 編碼方案、定長二進制方案、零拷貝方案和其他方案。下表從數據體積、序列化速度、易用性和典型應用場景四個維度進行對比,幫助開發者快速定位適合自己需求的序列化庫:
| YAS | 302 | |||
| Protobuf | 16116 | |||
| Cap'n Proto | 401 | |||
| FlatBuffers | 492 |


表注: 耗時數據基于 100 萬次序列化+反序列化測試,測試環境為 Intel Core i7 處理器。體積越小越好,耗時越短越好。易用性評分綜合考慮了學習曲線、文檔質量、調試便利性等因素。零拷貝方案的耗時包括 build/serialize/deserialize 完整周期。
場景 1:完整基準測試
測試所有序列化庫,每個庫執行 100,000 次序列化/反序列化操作:
./benchmark -i 100000
輸出示例:
Serializer: thrift-binary
Version : 0.12.0
Iterations: 100000
Size : 17017 bytes
Time : 1190 milliseconds
Serializer: protobuf
Version : 3.7.0
Iterations: 100000
Size : 16116 bytes
Time : 2312 milliseconds
...
場景 2:定向對比測試
僅對比 Protobuf 和 YAS 兩個庫的性能:
./benchmark -i 100000 -s protobuf,yas
場景 3:CSV 格式輸出
生成適合導入電子表格或數據分析工具的 CSV 格式結果:
./benchmark -i 100000 -c > results.csv
CSV 文件格式:
serializer,version,iterations,size,time
thrift-binary,0.12.0,100000,17017,1190
protobuf,3.7.0,100000,16116,2312
...
一份打通“應用→驅動”的Linux底層修煉指南!