blob: 49c3727582327accf5527d780f2b74fa35d5bb67 [file] [log] [blame] [view]
## Performance Comparison Report
_Generated on 2025-10-26 18:36:41_
How to generate performance report:
```bash
cargo bench 2>&1 | tee cargo_bench.log
python benchmark_report.py --log-file cargo_bench.log --output-dir=report_output
```
### Hardware & OS Info
| Key | Value |
| -------------------- | ------------- |
| OS | Darwin 24.5.0 |
| Machine | arm64 |
| Processor | arm |
| CPU Cores (Physical) | 12 |
| CPU Cores (Logical) | 12 |
| Total RAM (GB) | 48.0 |
### Benchmark Plots
**company**
<p align="center">
<img src="../../docs/benchmarks/rust/company.png" width="90%">
</p>
**ecommerce_data**
<p align="center">
<img src="../../docs/benchmarks/rust/ecommerce_data.png" width="90%">
</p>
**person**
<p align="center">
<img src="../../docs/benchmarks/rust/person.png" width="90%">
</p>
**simple_list**
<p align="center">
<img src="../../docs/benchmarks/rust/simple_list.png" width="90%">
</p>
**simple_map**
<p align="center">
<img src="../../docs/benchmarks/rust/simple_map.png" width="90%">
</p>
**simple_struct**
<p align="center">
<img src="../../docs/benchmarks/rust/simple_struct.png" width="90%">
</p>
**system_data**
<p align="center">
<img src="../../docs/benchmarks/rust/system_data.png" width="90%">
</p>
### Serialize Results
| Datatype | Size | Operation | Fory TPS | JSON TPS | Protobuf TPS | Fastest |
| -------------- | ------ | --------- | ---------- | ---------- | ------------ | ------- |
| company | small | serialize | 10,063,906 | 761,673 | 896,620 | fory |
| company | medium | serialize | 412,507 | 33,835 | 37,590 | fory |
| company | large | serialize | 9,183 | 793 | 880 | fory |
| ecommerce_data | small | serialize | 2,350,729 | 206,262 | 256,970 | fory |
| ecommerce_data | medium | serialize | 59,977 | 4,699 | 5,242 | fory |
| ecommerce_data | large | serialize | 3,727 | 266 | 295 | fory |
| person | small | serialize | 13,632,522 | 1,345,189 | 1,475,035 | fory |
| person | medium | serialize | 3,839,656 | 337,610 | 369,031 | fory |
| person | large | serialize | 907,853 | 79,631 | 91,408 | fory |
| simple_list | small | serialize | 27,726,945 | 4,874,957 | 4,643,172 | fory |
| simple_list | medium | serialize | 4,770,765 | 401,558 | 397,551 | fory |
| simple_list | large | serialize | 606,061 | 41,061 | 44,565 | fory |
| simple_map | small | serialize | 22,862,369 | 3,888,025 | 2,695,999 | fory |
| simple_map | medium | serialize | 2,128,973 | 204,319 | 193,132 | fory |
| simple_map | large | serialize | 177,847 | 18,419 | 18,668 | fory |
| simple_struct | small | serialize | 35,729,598 | 10,167,045 | 8,633,342 | fory |
| simple_struct | medium | serialize | 34,988,279 | 9,737,098 | 6,433,350 | fory |
| simple_struct | large | serialize | 31,801,558 | 4,545,041 | 7,420,049 | fory |
| system_data | small | serialize | 5,382,131 | 468,033 | 569,930 | fory |
| system_data | medium | serialize | 174,240 | 11,896 | 14,753 | fory |
| system_data | large | serialize | 10,671 | 876 | 1,040 | fory |
### Deserialize Results
| Datatype | Size | Operation | Fory TPS | JSON TPS | Protobuf TPS | Fastest |
| -------------- | ------ | ----------- | ---------- | ---------- | ------------ | ------- |
| company | small | deserialize | 1,145,593 | 718,597 | 917,431 | fory |
| company | medium | deserialize | 35,195 | 24,474 | 25,057 | fory |
| company | large | deserialize | 836 | 623 | 623 | fory |
| ecommerce_data | small | deserialize | 278,427 | 183,237 | 241,109 | fory |
| ecommerce_data | medium | deserialize | 5,622 | 3,820 | 4,249 | fory |
| ecommerce_data | large | deserialize | 298 | 204 | 217 | fory |
| person | small | deserialize | 1,924,372 | 1,214,388 | 1,675,631 | fory |
| person | medium | deserialize | 371,016 | 265,280 | 266,333 | fory |
| person | large | deserialize | 84,839 | 63,975 | 61,820 | fory |
| simple_list | small | deserialize | 6,129,329 | 3,599,582 | 4,429,286 | fory |
| simple_list | medium | deserialize | 460,745 | 305,409 | 337,336 | fory |
| simple_list | large | deserialize | 54,348 | 33,962 | 38,776 | fory |
| simple_map | small | deserialize | 3,686,364 | 3,090,426 | 3,477,051 | fory |
| simple_map | medium | deserialize | 171,774 | 126,638 | 119,323 | fory |
| simple_map | large | deserialize | 16,501 | 10,920 | 10,853 | fory |
| simple_struct | small | deserialize | 31,476,235 | 12,948,168 | 28,280,543 | fory |
| simple_struct | medium | deserialize | 30,077,902 | 10,431,118 | 23,012,841 | fory |
| simple_struct | large | deserialize | 28,201,585 | 8,955,759 | 23,528,858 | fory |
| system_data | small | deserialize | 644,870 | 421,106 | 549,209 | fory |
| system_data | medium | deserialize | 14,322 | 9,205 | 10,565 | fory |
| system_data | large | deserialize | 961 | 634 | 706 | fory |
### Serialized data size
| data type | data size | fory | protobuf |
| --------------- | --------- | ------- | -------- |
| simple-struct | small | 21 | 19 |
| simple-struct | medium | 70 | 66 |
| simple-struct | large | 220 | 216 |
| simple-list | small | 36 | 16 |
| simple-list | medium | 802 | 543 |
| simple-list | large | 14512 | 12876 |
| simple-map | small | 33 | 36 |
| simple-map | medium | 795 | 1182 |
| simple-map | large | 17893 | 21746 |
| person | small | 122 | 118 |
| person | medium | 873 | 948 |
| person | large | 7531 | 7865 |
| company | small | 191 | 182 |
| company | medium | 9118 | 9950 |
| company | large | 748105 | 782485 |
| e-commerce-data | small | 750 | 737 |
| e-commerce-data | medium | 53275 | 58025 |
| e-commerce-data | large | 1079358 | 1166878 |
| system-data | small | 311 | 315 |
| system-data | medium | 24301 | 26161 |
| system-data | large | 450031 | 479988 |
## How to generate flamegraph
Basic command:
```bash
cargo flamegraph --bin fory_profiler -- --operation deserialize --serializer fory -t e-commerce-data
```
Using criterion to generate flamegraph for any benchmark:
```bash
cargo bench --bench serialization_bench --features profiling -- simple_struct/fory_serialize/small --profile-time=10
ls ../target/criterion/simple_struct/fory_serialize/small/profile/flamegraph.svg
```
detailed command:
```bash
cd benches
rm -rf cargo-flamegraph.trace
export CARGO_PROFILE_RELEASE_DEBUG=true &&
cargo flamegraph \
--inverted \
--deterministic \
--palette rust \
--min-width 0.05 \
--bin fory_profiler -- \
--operation deserialize \
--serializer fory
```
## How to run benchmarks
```bash
cargo bench
```
To run only a specific benchmark group, you can use a command like
```bash
cargo bench --bench serialization_bench -- simple_struct
```
## How to print serialized data size
```bash
cargo run --bin fory_profiler -- --print-all-serialized-sizes
```