This directory contains benchmarks comparing Apache Fory with Protocol Buffers and MessagePack for Go serialization.
google.golang.org/protobufgithub.com/vmihailenco/msgpack/v5| Data Type | Description |
|---|---|
| NumericStruct | Simple struct with 8 int32 fields |
| Sample | Complex struct with primitives and 7 array types |
| MediaContent | Nested objects with strings, enums, and lists |
| StructList | List of NumericStruct (20 elements) |
| SampleList | List of Sample (20 elements) |
| MediaContentList | List of MediaContent (20 elements) |
The benchmark data matches the C++ benchmark for cross-language comparison.
protoc)Install protoc:
# macOS brew install protobuf # Ubuntu/Debian apt-get install protobuf-compiler # Or download from https://github.com/protocolbuffers/protobuf/releases
# Run all benchmarks ./run.sh # Run specific data type ./run.sh --data struct ./run.sh --data sample ./run.sh --data mediacontent ./run.sh --data structlist ./run.sh --data samplelist ./run.sh --data mediacontentlist # Run specific serializer ./run.sh --serializer fory ./run.sh --serializer protobuf ./run.sh --serializer msgpack # Combine filters ./run.sh --data struct --serializer fory # Customize benchmark parameters ./run.sh --count 10 --benchtime 2s # Skip report generation ./run.sh --no-report
# Generate protobuf code mkdir -p proto protoc --proto_path=../proto \ --go_out=proto \ --go_opt=paths=source_relative \ ../proto/bench.proto # Download dependencies go mod tidy # Run benchmarks go test -bench=. -benchmem # Run specific benchmark go test -bench=BenchmarkFory_Struct -benchmem
Example results on Apple M1 Pro:
| Data Type | Operation | Fory (ops/s) | Protobuf (ops/s) | Msgpack (ops/s) | Fory vs PB | Fory vs MP |
|---|---|---|---|---|---|---|
| Struct | Serialize | 15.16M | 10.23M | 5.41M | 1.48x | 2.80x |
| Struct | Deserialize | 12.10M | 11.01M | 3.23M | 1.10x | 3.75x |
| Structlist | Serialize | 1.58M | 561K | 299K | 2.82x | 5.28x |
| Structlist | Deserialize | 1.10M | 529K | 175K | 2.09x | 6.30x |
| Sample | Serialize | 7.28M | 2.72M | 670K | 2.68x | 10.87x |
| Sample | Deserialize | 3.79M | 2.37M | 376K | 1.60x | 10.09x |
| Samplelist | Serialize | 510K | 141K | 38K | 3.61x | 13.34x |
| Samplelist | Deserialize | 236K | 107K | 19K | 2.20x | 12.66x |
| Mediacontent | Serialize | 3.72M | 2.12M | 1.29M | 1.75x | 2.88x |
| Mediacontent | Deserialize | 2.34M | 1.81M | 698K | 1.30x | 3.35x |
| Mediacontentlist | Serialize | 268K | 110K | 72K | 2.44x | 3.72x |
| Mediacontentlist | Deserialize | 138K | 87K | 36K | 1.58x | 3.86x |
Note: Results vary by hardware. Run benchmarks on your own system for accurate comparisons. List benchmarks are included in the generated report.
| Data Type | Fory | Protobuf | Msgpack |
|---|---|---|---|
| Struct | 58 | 61 | 57 |
| Sample | 446 | 375 | 524 |
| MediaContent | 342 | 301 | 400 |
| StructList | 560 | 1260 | 1146 |
| SampleList | 7600 | 7560 | 10486 |
| MediaContentList | 5776 | 6080 | 8006 |
The benchmarks follow the same methodology as the C++ benchmark:
Conversion Cost Included: For protobuf, the benchmark includes converting plain Go structs to/from protobuf messages, matching real-world usage patterns.
Buffer Reuse: Each serializer uses its optimal pattern for buffer management.
Same Test Data: Test data matches the C++ benchmark exactly for cross-language comparisons.
-benchmem)After running ./run.sh:
benchmark_results.txt - Human-readable benchmark outputbenchmark_results.json - JSON format for programmatic analysisbenchmark_report.md - Generated markdown reportbenchmark_*.png - Performance comparison charts (requires matplotlib)go_benchmark/
├── README.md # This file
├── go.mod # Go module definition
├── models.go # Data structures (NumericStruct, Sample, MediaContent)
├── proto_convert.go # Protobuf conversion utilities
├── benchmark_test.go # Benchmark tests
├── run.sh # Build and run script
├── benchmark_report.py # Report generation script
└── proto/ # Generated protobuf code (after running)
└── bench.pb.go
When adding new benchmarks:
models.goproto_convert.gobenchmark_test.goLicensed under the Apache License, Version 2.0.