Rust serialization benchmark

April 24, 2026 · View on GitHub

The goal of these benchmarks is to provide thorough and complete benchmarks for various rust serialization frameworks.

Maintainers

These benchmarks are maintained by a small group of volunteers. Special thanks to:

These benchmarks are a work in progress

These benchmarks are still being developed and pull requests to improve benchmarks are welcome.

Interactive site

Calculate the number of messages per second that can be sent/received with various rust serialization frameworks and compression libraries. Documentation

Format

All tests benchmark the following properties (time or size):

  • Serialize: serialize data into a buffer
  • Deserialize: deserializes a buffer into a normal rust object
  • Borrow: deserializes a buffer into a rust object that borrows string data from the input, with lifetime
  • Size: the size of the buffer when serialized
  • Zlib: the size of the buffer after zlib compression
  • Zstd: the size of the buffer after zstd compression
  • Zstd Time: the time taken to compress the serialized buffer with zstd

Zero-copy deserialization libraries have an additional set of benchmarks:

  • Access: accesses a buffer as structured data
  • Read: runs through a buffer and reads fields out of it
  • Update: updates a buffer as structured data

Some benchmark results may be italicized and followed by an asterisk. Mouse over these for more details on what situation was benchmarked. Other footnotes are located at the bottom.

Last updated: 2026-04-24 06:15:02

Runtime info

rustc version

rustc 1.97.0-nightly (36ba2c771 2026-04-23)
binary: rustc
commit-hash: 36ba2c7712052d731a7082d0eba5ed3d9d56c133
commit-date: 2026-04-23
host: x86_64-unknown-linux-gnu
release: 1.97.0-nightly
LLVM version: 22.1.2

CPU info

Architecture:                            x86_64
CPU op-mode(s):                          32-bit, 64-bit
Address sizes:                           48 bits physical, 48 bits virtual
Byte Order:                              Little Endian
CPU(s):                                  4
On-line CPU(s) list:                     0-3
Vendor ID:                               AuthenticAMD
Model name:                              AMD EPYC 7763 64-Core Processor
CPU family:                              25
Model:                                   1
Thread(s) per core:                      2
Core(s) per socket:                      2
Socket(s):                               1
Stepping:                                1
BogoMIPS:                                4890.84
Flags:                                   fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc cpuid extd_apicid aperfmperf tsc_known_freq pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext vmmcall fsgsbase bmi1 avx2 smep bmi2 erms invpcid rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 xsaves user_shstk clzero xsaveerptr rdpru arat npt nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold v_vmsave_vmload umip vaes vpclmulqdq rdpid fsrm
Virtualization:                          AMD-V
Hypervisor vendor:                       Microsoft
Virtualization type:                     full
L1d cache:                               64 KiB (2 instances)
L1i cache:                               64 KiB (2 instances)
L2 cache:                                1 MiB (2 instances)
L3 cache:                                32 MiB (1 instance)
NUMA node(s):                            1
NUMA node0 CPU(s):                       0-3
Vulnerability Gather data sampling:      Not affected
Vulnerability Ghostwrite:                Not affected
Vulnerability Indirect target selection: Not affected
Vulnerability Itlb multihit:             Not affected
Vulnerability L1tf:                      Not affected
Vulnerability Mds:                       Not affected
Vulnerability Meltdown:                  Not affected
Vulnerability Mmio stale data:           Not affected
Vulnerability Old microcode:             Not affected
Vulnerability Reg file data sampling:    Not affected
Vulnerability Retbleed:                  Not affected
Vulnerability Spec rstack overflow:      Vulnerable: Safe RET, no microcode
Vulnerability Spec store bypass:         Vulnerable
Vulnerability Spectre v1:                Mitigation; usercopy/swapgs barriers and __user pointer sanitization
Vulnerability Spectre v2:                Mitigation; Retpolines; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected
Vulnerability Srbds:                     Not affected
Vulnerability Tsa:                       Vulnerable: No microcode
Vulnerability Tsx async abort:           Not affected
Vulnerability Vmscape:                   Not affected

log

This data set is composed of HTTP request logs that are small and contain many strings.

Raw data

For operations, time per iteration; for size, bytes. Lower is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeBorrowSizeZlibZstdZstd Time
bilrost 0.1013.0463.27 µs* 421.45 µs*2.5464 ms868.75 µs8049553289412848494.1190 ms
bin-proto 0.12.74.3115 ms4.6458 ms10457843731273115534.4838 ms
bincode 2.0.1336.98 µs2.1362 ms702.50 µs7412953039442564223.4239 ms
bincode 1.3.3552.43 µs2.0893 ms634.28 µs10457843731273115534.4718 ms
bitcode 0.6.6138.84 µs1.4670 ms60.887 µs7037102888262273222.5535 ms
borsh 1.5.7554.36 µs2.1627 ms8857803622042862484.0821 ms
capnp 0.23.2489.09 µs14432165139864265326.1265 ms
cbor:
cbor4ii 1.0.0
615.78 µs5.2106 ms3.3812 ms14078354034403235615.0241 ms
cbor:
ciborium 0.2.2
3.2815 ms11.190 ms14078354034403235615.0583 ms
cbor:
serde_cbor 0.11.2
1.8804 ms5.0705 ms3.2425 ms14078354034403235614.7074 ms
columnar 0.11.1253.08 µs2.1896 ms 823.75 µs*10459283702122939074.0919 ms
compactly 0.1.627.013 ms20.273 ms241251241453241263106.06 µs
databuf 0.5.0261.34 µs2.0443 ms677.51 µs7657783117152639143.4782 ms
dlhn 0.1.7671.06 µs2.5803 ms7249533014462530563.1694 ms
flatbuffers 25.12.191.0315 ms12763684685393883814.7773 ms
flexbuffers 25.2.107.1672 ms7.0418 ms5.7929 ms18297567143186915418.5374 ms
json:
flexon 0.4.5
2.7541 ms3.7759 ms18274614705603607275.4796 ms
json:
serde_json 1.0.140
3.8240 ms5.9020 ms18274614705603607275.4606 ms
json:
simd-json 0.15.1
2.1577 ms4.7827 ms18274614705603607275.4415 ms
messagepack:
msgpacker 0.7.1
359.25 µs2.5971 ms915.95 µs7649963152912642123.5858 ms
messagepack:
rmp-serde 1.3.0
1.4960 ms3.1607 ms1.4255 ms7849973253842776083.7620 ms
messagepack:
zerompk 0.3.2
367.94 µs2.5236 ms811.98 µs7849973253842776083.8162 ms
minicbor 1.0.0540.87 µs3.0434 ms1.4527 ms8178303326712840344.0156 ms
nachricht-serde 0.4.05.5551 ms4.0181 ms2.4616 ms8186693325562847974.0411 ms
nanoserde 0.2.1235.43 µs2.1075 ms10457843731273115534.1062 ms
nibblecode 0.1.0185.21 µs10114874824644127985.3821 ms
postcard 1.1.1428.61 µs2.2860 ms722.58 µs7249533023992529683.2395 ms
pot 3.0.12.3099 ms6.5076 ms4.7785 ms9719223725133036364.3426 ms
protobuf:
prost 0.14.1
965.84 µs* 2.4952 ms*3.4402 ms8846283631303149594.3744 ms
protobuf:
protobuf 3.7.2
1.2006 ms* 3.0299 ms*3.8241 ms8846283631303149594.3629 ms
rkyv 0.8.10247.23 µs1.5516 ms* 1.9196 ms*10114883935263259654.6029 ms
ron 0.10.112.653 ms23.325 ms21.018 ms16074594491583493245.5392 ms
savefile 0.18.6196.45 µs2.1852 ms10458003731393115624.2110 ms
scale:
parity-scale-codec 3.7.5
663.24 µs2.4206 ms7657783117432638223.4457 ms
serde-brief 0.1.11.4299 ms4.8016 ms3.0037 ms15849464137333399644.8675 ms
serde_bare 0.5.0685.89 µs2.1062 ms7657783117152639143.5596 ms
speedy 0.8.7200.26 µs1.7527 ms373.00 µs8857803622042862483.8130 ms
wincode 0.5.3174.76 µs1.7708 ms384.10 µs10457843731273115534.1447 ms
wiring 0.2.4193.02 µs2.0742 ms10457843379302758083.6329 ms

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.278.816 ns*135.62 µs*
columnar 0.11.123.520 ns
flatbuffers 25.12.192.4898 ns* 2.0752 ms*51.872 µs* 2.1850 ms*
nibblecode 0.1.01.2445 ns* 237.00 µs*10.391 µs* 247.60 µs*7.6650 µs*
rkyv 0.8.101.2462 ns* 354.08 µs*10.432 µs* 366.21 µs*7.6281 µs*

Comparison

Relative to best. Higher is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeBorrowSizeZlibZstdZstd Time
bilrost 0.1013.029.97%* 32.94%*32.35%7.01%29.97%73.40%79.80%2.57%
bin-proto 0.12.73.22%17.73%23.07%64.71%72.96%2.37%
bincode 2.0.141.20%38.56%8.67%32.54%79.44%88.65%3.10%
bincode 1.3.325.13%39.43%9.60%23.07%64.71%72.96%2.37%
bitcode 0.6.6100.00%56.15%100.00%34.28%83.60%100.00%4.15%
borsh 1.5.725.05%38.09%27.24%66.66%79.41%2.60%
capnp 0.23.228.39%16.72%46.98%53.30%1.73%
cbor:
cbor4ii 1.0.0
22.55%15.81%1.80%17.14%59.85%70.26%2.11%
cbor:
ciborium 0.2.2
4.23%7.36%17.14%59.85%70.26%2.10%
cbor:
serde_cbor 0.11.2
7.38%16.25%1.88%17.14%59.85%70.26%2.25%
columnar 0.11.154.86%37.62% 100.00%*23.07%65.22%77.34%2.59%
compactly 0.1.60.51%4.06%100.00%100.00%94.22%100.00%
databuf 0.5.053.13%40.29%8.99%31.50%77.46%86.13%3.05%
dlhn 0.1.720.69%31.92%33.28%80.10%89.83%3.35%
flatbuffers 25.12.1913.46%18.90%51.53%58.53%2.22%
flexbuffers 25.2.101.94%11.70%1.05%13.18%33.80%32.87%1.24%
json:
flexon 0.4.5
5.04%21.82%13.20%51.31%63.02%1.94%
json:
serde_json 1.0.140
3.63%13.96%13.20%51.31%63.02%1.94%
json:
simd-json 0.15.1
6.43%17.22%13.20%51.31%63.02%1.95%
messagepack:
msgpacker 0.7.1
38.65%31.72%6.65%31.54%76.58%86.04%2.96%
messagepack:
rmp-serde 1.3.0
9.28%26.06%4.27%30.73%74.21%81.89%2.82%
messagepack:
zerompk 0.3.2
37.73%32.64%7.50%30.73%74.21%81.89%2.78%
minicbor 1.0.025.67%27.07%4.19%29.50%72.58%80.03%2.64%
nachricht-serde 0.4.02.50%20.50%2.47%29.47%72.61%79.82%2.62%
nanoserde 0.2.158.97%39.09%23.07%64.71%72.96%2.58%
nibblecode 0.1.074.96%23.85%50.05%55.07%1.97%
postcard 1.1.132.39%36.03%8.43%33.28%79.85%89.86%3.27%
pot 3.0.16.01%12.66%1.27%24.82%64.82%74.87%2.44%
protobuf:
prost 0.14.1
14.38%* 5.56%*23.94%27.27%66.49%72.18%2.42%
protobuf:
protobuf 3.7.2
11.56%* 4.58%*21.54%27.27%66.49%72.18%2.43%
rkyv 0.8.1056.16%53.09%* 42.91%*23.85%61.36%69.74%2.30%
ron 0.10.11.10%3.53%0.29%15.01%53.76%65.07%1.91%
savefile 0.18.670.67%37.70%23.07%64.71%72.96%2.52%
scale:
parity-scale-codec 3.7.5
20.93%34.03%31.50%77.45%86.16%3.08%
serde-brief 0.1.19.71%17.16%2.03%15.22%58.36%66.87%2.18%
serde_bare 0.5.020.24%39.11%31.50%77.46%86.13%2.98%
speedy 0.8.769.33%47.00%16.32%27.24%66.66%79.41%2.78%
wincode 0.5.379.45%46.52%15.85%23.07%64.71%72.96%2.56%
wiring 0.2.471.93%39.71%23.07%71.45%82.42%2.92%

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.21.58%*7.66%*
columnar 0.11.15.29%
flatbuffers 25.12.1949.98%* 0.00%*20.03%* 0.48%*
nibblecode 0.1.0100.00%* 0.00%*100.00%* 4.20%*99.52%*
rkyv 0.8.1099.86%* 0.00%*99.61%* 2.84%*100.00%*

mesh

This data set is a single mesh. The mesh contains an array of triangles, each of which has three vertices and a normal vector.

Raw data

For operations, time per iteration; for size, bytes. Lower is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeSizeZlibZstdZstd Time
bilrost 0.1013.07.2020 ms* 8.7458 ms*7.8226 ms86250056443961623157272.058 ms
bin-proto 0.12.78.3393 ms10.689 ms6000008537850053469088.4314 ms
bincode 2.0.12.4162 ms1.0456 ms6000005537849753468828.6628 ms
bincode 1.3.35.8836 ms5.8333 ms6000008537850053469088.7681 ms
bitcode 0.6.61.2996 ms806.01 µs60000065182295492184113.249 ms
borsh 1.5.76.2591 ms4.1592 ms6000004537849653468668.6217 ms
capnp 0.23.25.7059 ms140000887130367604618280.451 ms
cbor:
cbor4ii 1.0.0
9.1304 ms50.453 ms131250167524114675743789.448 ms
cbor:
ciborium 0.2.2
68.830 ms126.55 ms131223247524660675912889.850 ms
cbor:
serde_cbor 0.11.2
35.006 ms41.163 ms131223247524660675912890.454 ms
columnar 0.11.11.7579 ms1.4554 ms 682.70 µs*6000120537843553470398.4854 ms
compactly 0.1.6355.96 ms282.18 ms4846786485006548469031.6494 ms
databuf 0.5.02.4208 ms5.3140 ms6000003537849553468978.7054 ms
dlhn 0.1.76.1790 ms7.0399 ms6000003537849553468978.7000 ms
flatbuffers 25.12.19447.14 µs6000024537843453468788.8618 ms
flexbuffers 25.2.10107.66 ms87.528 ms266094241190104012486322152.07 ms
json:
flexon 0.4.5
76.064 ms56.165 ms2619288395660848584671155.76 ms
json:
serde_json 1.0.140
89.311 ms100.74 ms2619288395660848584671156.63 ms
json:
simd-json 0.15.1
53.433 ms67.458 ms2619288395660848584671157.56 ms
messagepack:
msgpacker 0.7.1
658.24 µs5.1937 ms75000056058442601450010.454 ms
messagepack:
rmp-serde 1.3.0
18.796 ms16.611 ms81250066494876639103774.688 ms
messagepack:
zerompk 0.3.2
730.09 µs5.4958 ms81250066494876639103776.263 ms
minicbor 1.0.06.0937 ms11.604 ms81250066494907639089470.772 ms
nachricht-serde 0.4.0119.11 ms24.712 ms81250376493484638694069.905 ms
nanoserde 0.2.11.6047 ms894.73 µs6000008537850053469088.9363 ms
nibblecode 0.1.0148.53 µs6000008537850053469088.4435 ms
postcard 1.1.1480.23 µs1.0021 ms6000003537849553468978.6135 ms
pot 3.0.138.693 ms69.991 ms101223426814618685225280.836 ms
protobuf:
prost 0.14.1
7.8160 ms* 8.3242 ms*13.192 ms87500006665735642187771.685 ms
protobuf:
protobuf 3.7.2
14.397 ms* 30.902 ms*29.980 ms87500006665735642187772.313 ms
rkyv 0.8.10150.61 µs150.45 µs* 151.76 µs*6000008537850053468728.6878 ms
ron 0.10.1163.42 ms517.22 ms2219288589703958137334151.53 ms
savefile 0.18.6149.17 µs150.54 µs6000024537851953468968.7785 ms
scale:
parity-scale-codec 3.7.5
5.1614 ms3.9662 ms6000004537849653468668.6146 ms
serde-brief 0.1.117.539 ms38.859 ms157500158024540681366792.710 ms
serde_bare 0.5.06.0223 ms4.8479 ms6000003537849553468978.9697 ms
speedy 0.8.7183.09 µs150.54 µs6000004537849653468668.4238 ms
wincode 0.5.3149.40 µs149.19 µs6000008537850053469088.6476 ms
wiring 0.2.4199.41 µs337.12 µs6000008537895253469058.6090 ms

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.2111.06 ns*1.9654 ms*
columnar 0.11.121.789 ns
flatbuffers 25.12.192.4907 ns* 45.146 ns*77.841 µs* 77.999 µs*
nibblecode 0.1.01.2453 ns* 1.8688 ns*38.906 µs* 38.921 µs*79.383 µs*
rkyv 0.8.101.2463 ns* 5.2983 ns*38.901 µs* 38.911 µs*75.717 µs*

Comparison

Relative to best. Higher is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeSizeZlibZstdZstd Time
bilrost 0.1013.02.06%* 1.70%*1.91%56.19%75.27%77.78%2.29%
bin-proto 0.12.71.78%1.40%80.78%90.18%90.65%19.56%
bincode 2.0.16.15%14.27%80.78%90.18%90.65%19.04%
bincode 1.3.32.52%2.56%80.78%90.18%90.65%18.81%
bitcode 0.6.611.43%18.51%80.78%93.59%98.48%12.45%
borsh 1.5.72.37%3.59%80.78%90.18%90.65%19.13%
capnp 0.23.22.60%34.62%68.02%80.16%2.05%
cbor:
cbor4ii 1.0.0
1.63%0.30%36.93%64.46%71.73%1.84%
cbor:
ciborium 0.2.2
0.22%0.12%36.94%64.46%71.71%1.84%
cbor:
serde_cbor 0.11.2
0.42%0.36%36.94%64.46%71.71%1.82%
columnar 0.11.18.45%10.25% 21.85%*80.78%90.18%90.65%19.44%
compactly 0.1.60.04%0.05%100.00%100.00%100.00%100.00%
databuf 0.5.06.14%2.81%80.78%90.18%90.65%18.95%
dlhn 0.1.72.40%2.12%80.78%90.18%90.65%18.96%
flatbuffers 25.12.1933.22%80.78%90.18%90.65%18.61%
flexbuffers 25.2.100.14%0.17%18.21%40.75%38.82%1.08%
json:
flexon 0.4.5
0.20%0.27%18.50%50.70%56.46%1.06%
json:
serde_json 1.0.140
0.17%0.15%18.50%50.70%56.46%1.05%
json:
simd-json 0.15.1
0.28%0.22%18.50%50.70%56.46%1.05%
messagepack:
msgpacker 0.7.1
22.56%2.87%64.62%80.05%80.59%15.78%
messagepack:
rmp-serde 1.3.0
0.79%0.90%59.65%74.68%75.84%2.21%
messagepack:
zerompk 0.3.2
20.34%2.71%59.65%74.68%75.84%2.16%
minicbor 1.0.02.44%1.29%59.65%74.67%75.84%2.33%
nachricht-serde 0.4.00.12%0.60%59.65%74.69%75.89%2.36%
nanoserde 0.2.19.26%16.67%80.78%90.18%90.65%18.46%
nibblecode 0.1.0100.00%80.78%90.18%90.65%19.53%
postcard 1.1.130.93%14.89%80.78%90.18%90.65%19.15%
pot 3.0.10.38%0.21%47.88%71.17%70.73%2.04%
protobuf:
prost 0.14.1
1.90%* 1.78%*1.13%55.39%72.76%75.47%2.30%
protobuf:
protobuf 3.7.2
1.03%* 0.48%*0.50%55.39%72.76%75.47%2.28%
rkyv 0.8.1098.62%99.16%* 98.31%*80.78%90.18%90.65%18.99%
ron 0.10.10.09%0.03%21.84%54.07%59.56%1.09%
savefile 0.18.699.57%99.10%80.78%90.17%90.65%18.79%
scale:
parity-scale-codec 3.7.5
2.88%3.76%80.78%90.18%90.65%19.15%
serde-brief 0.1.10.85%0.38%30.77%60.44%71.14%1.78%
serde_bare 0.5.02.47%3.08%80.78%90.18%90.65%18.39%
speedy 0.8.781.12%99.10%80.78%90.18%90.65%19.58%
wincode 0.5.399.42%100.00%80.78%90.18%90.65%19.07%
wiring 0.2.474.48%44.25%80.78%90.17%90.65%19.16%

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.21.12%*1.98%*
columnar 0.11.15.72%
flatbuffers 25.12.1950.00%* 2.76%*49.97%* 49.87%*
nibblecode 0.1.0100.00%* 66.64%*99.99%* 99.95%*95.38%*
rkyv 0.8.1099.92%* 23.50%*100.00%* 99.97%*100.00%*

minecraft_savedata

This data set is composed of Minecraft player saves that contain highly structured data.

Raw data

For operations, time per iteration; for size, bytes. Lower is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeBorrowSizeZlibZstdZstd Time
bilrost 0.1013.0871.40 µs* 788.06 µs*3.1260 ms1.6942 ms4893482811732493602.5972 ms
bin-proto 0.12.71.8392 ms2.7888 ms5669752393502314752.4831 ms
bincode 2.0.1310.03 µs1.8123 ms790.67 µs3674132212912062422.0557 ms
bincode 1.3.3586.57 µs1.8542 ms878.48 µs5699752405252318842.6039 ms
bitcode 0.6.6125.47 µs1.2641 ms172.07 µs327688200947182040764.22 µs
borsh 1.5.7554.91 µs1.8126 ms4465952342362098342.0730 ms
capnp 0.23.2462.10 µs8038963356062807443.5540 ms
cbor:
cbor4ii 1.0.0
746.63 µs4.8106 ms3.4464 ms11098313447452743333.4497 ms
cbor:
ciborium 0.2.2
3.8780 ms10.434 ms11098213447512743453.4407 ms
cbor:
serde_cbor 0.11.2
1.8484 ms4.6962 ms3.4226 ms11098213447512743453.4592 ms
columnar 0.11.1283.96 µs1.9011 ms 757.24 µs*5637282496962175821.5903 ms
compactly 0.1.611.695 ms11.326 ms14929214943314930489.286 µs
databuf 0.5.0290.10 µs1.7442 ms813.00 µs3563112130621984032.0706 ms
dlhn 0.1.7700.89 µs2.6920 ms3664962206002055862.0428 ms
flatbuffers 25.12.193.2534 ms8494723478162948713.5275 ms
flexbuffers 25.2.108.0904 ms6.7970 ms5.5496 ms11876885576425537306.3734 ms
json:
flexon 0.4.5
2.7258 ms4.6322 ms16231914665273591575.8108 ms
json:
serde_json 1.0.140
3.8230 ms7.1742 ms16231914665273591576.0083 ms
json:
simd-json 0.15.1
2.2216 ms4.5452 ms16231914665273591575.8067 ms
messagepack:
msgpacker 0.7.1
330.97 µs2.9087 ms1.3075 ms3912512368772203952.2390 ms
messagepack:
rmp-serde 1.3.0
1.4644 ms3.0465 ms1.6893 ms4245332452142260772.2841 ms
messagepack:
zerompk 0.3.2
387.49 µs2.2223 ms934.85 µs4160252438122249652.2336 ms
minicbor 1.0.0538.38 µs3.3885 ms1.9224 ms4287732498572286302.3341 ms
nachricht-serde 0.4.04.9905 ms3.7821 ms2.6819 ms4497452524322309652.4316 ms
nanoserde 0.2.1265.12 µs1.9016 ms5679752399302318722.4954 ms
nibblecode 0.1.0180.97 µs6039284304584064013.6625 ms
postcard 1.1.1452.70 µs2.0750 ms808.11 µs3674892219132072442.0347 ms
pot 3.0.12.4078 ms6.1816 ms5.0284 ms5991252991582476752.7391 ms
protobuf:
prost 0.14.1
1.3000 ms* 3.0423 ms*3.5767 ms5968113053192687372.9979 ms
protobuf:
protobuf 3.7.2
1.0446 ms* 3.0167 ms*3.8998 ms5968113053192687373.0016 ms
rkyv 0.8.10331.98 µs1.5065 ms* 1.8713 ms*6037762547762194212.3575 ms
ron 0.10.18.3636 ms24.075 ms22.954 ms14652234349353429075.6865 ms
savefile 0.18.6215.65 µs1.8087 ms5669912393622314782.4783 ms
scale:
parity-scale-codec 3.7.5
628.17 µs2.1147 ms3563112129761984231.9434 ms
serde-brief 0.1.11.1753 ms5.2765 ms3.6409 ms12760143738982933843.7126 ms
serde_bare 0.5.0744.85 µs2.3721 ms3563112130621984031.9970 ms
speedy 0.8.7268.76 µs1.6917 ms550.91 µs4495952349702101922.0667 ms
wincode 0.5.3204.48 µs1.6446 ms564.28 µs5669752393502314752.4986 ms
wiring 0.2.4207.20 µs1.9688 ms5669752478102250862.5622 ms

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.285.434 ns*424.45 ns*
columnar 0.11.1885.21 ns
flatbuffers 25.12.192.5064 ns* 2.1701 ms*1.4201 µs* 2.1721 ms*
nibblecode 0.1.01.2453 ns* 256.05 µs*156.26 ns* 258.70 µs*726.15 ns*
rkyv 0.8.101.2446 ns* 336.57 µs*156.21 ns* 335.79 µs*730.21 ns*

Comparison

Relative to best. Higher is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeBorrowSizeZlibZstdZstd Time
bilrost 0.1013.014.40%* 15.92%*24.22%10.16%30.51%53.15%59.87%3.44%
bin-proto 0.12.76.82%27.15%26.33%62.43%64.50%3.60%
bincode 2.0.140.47%41.78%21.76%40.63%67.53%72.39%4.34%
bincode 1.3.321.39%40.84%19.59%26.19%62.13%64.39%3.43%
bitcode 0.6.6100.00%59.90%100.00%45.56%74.36%82.02%11.68%
borsh 1.5.722.61%41.78%33.43%63.80%71.15%4.31%
capnp 0.23.227.15%18.57%44.53%53.18%2.51%
cbor:
cbor4ii 1.0.0
16.80%15.74%4.99%13.45%43.35%54.42%2.59%
cbor:
ciborium 0.2.2
3.24%7.26%13.45%43.35%54.42%2.59%
cbor:
serde_cbor 0.11.2
6.79%16.12%5.03%13.45%43.35%54.42%2.58%
columnar 0.11.144.19%39.83% 100.00%*26.48%59.85%68.62%5.61%
compactly 0.1.61.07%6.69%100.00%100.00%100.00%100.00%
databuf 0.5.043.25%43.41%21.16%41.90%70.14%75.25%4.31%
dlhn 0.1.717.90%28.13%40.73%67.74%72.62%4.37%
flatbuffers 25.12.193.86%17.57%42.96%50.63%2.53%
flexbuffers 25.2.101.55%11.14%3.10%12.57%26.80%26.96%1.40%
json:
flexon 0.4.5
4.60%16.35%9.20%32.03%41.57%1.54%
json:
serde_json 1.0.140
3.28%10.56%9.20%32.03%41.57%1.49%
json:
simd-json 0.15.1
5.65%16.66%9.20%32.03%41.57%1.54%
messagepack:
msgpacker 0.7.1
37.91%26.03%13.16%38.16%63.08%67.74%3.99%
messagepack:
rmp-serde 1.3.0
8.57%24.86%10.19%35.17%60.94%66.04%3.91%
messagepack:
zerompk 0.3.2
32.38%34.07%18.41%35.89%61.29%66.37%4.00%
minicbor 1.0.023.31%22.35%8.95%34.82%59.81%65.30%3.83%
nachricht-serde 0.4.02.51%20.02%6.42%33.19%59.20%64.64%3.67%
nanoserde 0.2.147.33%39.82%26.28%62.28%64.39%3.58%
nibblecode 0.1.069.33%24.72%34.71%36.74%2.44%
postcard 1.1.127.72%36.49%21.29%40.62%67.34%72.04%4.39%
pot 3.0.15.21%12.25%3.42%24.92%49.95%60.28%3.26%
protobuf:
prost 0.14.1
9.65%* 4.12%*21.17%25.01%48.94%55.56%2.98%
protobuf:
protobuf 3.7.2
12.01%* 4.16%*19.42%25.01%48.94%55.56%2.97%
rkyv 0.8.1037.79%50.26%* 40.47%*24.73%58.65%68.04%3.79%
ron 0.10.11.50%3.15%0.75%10.19%34.36%43.54%1.57%
savefile 0.18.658.18%41.87%26.33%62.43%64.50%3.60%
scale:
parity-scale-codec 3.7.5
19.97%35.81%41.90%70.16%75.25%4.59%
serde-brief 0.1.110.68%14.35%4.73%11.70%39.97%50.89%2.40%
serde_bare 0.5.016.85%31.92%41.90%70.14%75.25%4.47%
speedy 0.8.746.68%44.76%31.23%33.21%63.60%71.03%4.32%
wincode 0.5.361.36%46.04%30.49%26.33%62.43%64.50%3.57%
wiring 0.2.460.56%38.46%26.33%60.30%66.33%3.48%

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.21.46%*36.80%*
columnar 0.11.10.14%
flatbuffers 25.12.1949.66%* 0.00%*11.00%* 0.01%*
nibblecode 0.1.099.94%* 0.00%*99.97%* 0.06%*100.00%*
rkyv 0.8.10100.00%* 0.00%*100.00%* 0.05%*99.44%*

mk48

This data set is composed of mk48.io game updates that contain data with many exploitable patterns and invariants.

Raw data

For operations, time per iteration; for size, bytes. Lower is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeSizeZlibZstdZstd Time
bilrost 0.1013.04.5741 ms* 2.5549 ms*8.2770 ms17046431294259124566811.796 ms
bin-proto 0.12.75.1211 ms6.4536 ms17914891127998105114610.417 ms
bincode 2.0.11.2346 ms3.6320 ms1406257111780210624389.7152 ms
bincode 1.3.33.7322 ms4.5054 ms18542341141994104874510.592 ms
bitcode 0.6.6694.57 µs2.3644 ms9713188780348503403.1217 ms
borsh 1.5.72.9326 ms2.9198 ms15219891108471103852810.283 ms
capnp 0.23.22.2717 ms27242881546992123911114.842 ms
cbor:
cbor4ii 1.0.0
3.2788 ms18.829 ms60125391695215146495121.828 ms
cbor:
ciborium 0.2.2
23.745 ms52.408 ms60123731695146146502522.169 ms
cbor:
serde_cbor 0.11.2
9.9053 ms21.738 ms60123731695146146502521.552 ms
columnar 0.11.1910.33 µs3.7581 ms 1.2611 ms*15447529967288970734.8672 ms
compactly 0.1.664.210 ms56.420 ms802662803238802689355.42 µs
databuf 0.5.01.3323 ms3.7732 ms1319999106263110083349.2551 ms
dlhn 0.1.74.4771 ms7.3137 ms1311281107752010460959.4147 ms
flatbuffers 25.12.194.9509 ms23256201439185126806013.674 ms
flexbuffers 25.2.1041.490 ms35.851 ms53526802658295277796734.913 ms
json:
flexon 0.4.5
15.315 ms24.422 ms93904612391679184276735.157 ms
json:
serde_json 1.0.140
22.268 ms31.760 ms93904612391679184276735.122 ms
json:
simd-json 0.15.1
11.897 ms25.714 ms93904612391679184276735.583 ms
messagepack:
msgpacker 0.7.1
947.27 µs5.7379 ms1458773115605511377889.7691 ms
messagepack:
rmp-serde 1.3.0
10.425 ms10.894 ms17453221261627122892312.350 ms
messagepack:
zerompk 0.3.2
1.8366 ms5.5016 ms17944671273669124230112.222 ms
minicbor 1.0.02.4107 ms11.569 ms17773861276218125255813.069 ms
nachricht-serde 0.4.029.976 ms16.522 ms17700601277755126336212.661 ms
nanoserde 0.2.11.3066 ms2.7828 ms18124041134820105310910.578 ms
nibblecode 0.1.0507.76 µs20759361548252143967114.256 ms
postcard 1.1.11.8670 ms4.1950 ms1311281108390010414348.7948 ms
pot 3.0.114.075 ms30.142 ms26048121482233129892816.644 ms
protobuf:
prost 0.14.1
5.5057 ms* 9.4135 ms*8.7297 ms18598861338076129535112.862 ms
protobuf:
protobuf 3.7.2
5.8977 ms* 13.199 ms*12.284 ms18598861338076129535112.977 ms
rkyv 0.8.10986.03 µs2.2204 ms* 2.6625 ms*20759361383779121037713.746 ms
ron 0.10.144.081 ms150.12 ms86777032233642182618035.838 ms
savefile 0.18.6873.62 µs2.5506 ms17915051128012105115310.681 ms
scale:
parity-scale-codec 3.7.5
3.1568 ms3.3145 ms1319999106438010107088.9453 ms
serde-brief 0.1.15.6084 ms22.199 ms69517721796265156781923.945 ms
serde_bare 0.5.04.8359 ms5.0083 ms1319999106264510083499.0946 ms
speedy 0.8.7747.00 µs2.4601 ms15847341119837103799210.113 ms
wincode 0.5.3596.56 µs2.3296 ms17914891127998105114610.318 ms
wiring 0.2.4649.92 µs2.7587 ms17914891156963108281511.088 ms

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.285.420 ns*725.20 ns*
columnar 0.11.158.045 ns
flatbuffers 25.12.192.4926 ns* 5.7462 ms*2.7558 µs* 5.7536 ms*
nibblecode 0.1.01.2458 ns* 342.92 µs*378.73 ns* 342.28 µs*237.58 ns*
rkyv 0.8.101.2451 ns* 417.91 µs*387.42 ns* 418.58 µs*235.48 ns*

Comparison

Relative to best. Higher is better.

Serialize / deserialize speed and size

CrateSerializeDeserializeSizeZlibZstdZstd Time
bilrost 0.1013.011.10%* 19.87%*15.24%47.09%62.06%64.44%3.01%
bin-proto 0.12.79.92%19.54%44.80%71.21%76.36%3.41%
bincode 2.0.141.13%34.72%57.08%71.86%75.55%3.66%
bincode 1.3.313.60%27.99%43.29%70.34%76.54%3.36%
bitcode 0.6.673.10%53.34%82.64%91.48%94.40%11.39%
borsh 1.5.717.31%43.19%52.74%72.46%77.29%3.46%
capnp 0.23.222.35%29.46%51.92%64.78%2.39%
cbor:
cbor4ii 1.0.0
15.49%6.70%13.35%47.38%54.79%1.63%
cbor:
ciborium 0.2.2
2.14%2.41%13.35%47.38%54.79%1.60%
cbor:
serde_cbor 0.11.2
5.13%5.80%13.35%47.38%54.79%1.65%
columnar 0.11.155.78%33.56% 100.00%*51.96%80.59%89.48%7.30%
compactly 0.1.60.79%2.24%100.00%100.00%100.00%100.00%
databuf 0.5.038.11%33.42%60.81%75.59%79.61%3.84%
dlhn 0.1.711.34%17.24%61.21%74.55%76.73%3.78%
flatbuffers 25.12.1910.26%34.51%55.81%63.30%2.60%
flexbuffers 25.2.101.22%3.52%15.00%30.22%28.89%1.02%
json:
flexon 0.4.5
3.32%5.16%8.55%33.58%43.56%1.01%
json:
serde_json 1.0.140
2.28%3.97%8.55%33.58%43.56%1.01%
json:
simd-json 0.15.1
4.27%4.90%8.55%33.58%43.56%1.00%
messagepack:
msgpacker 0.7.1
53.60%21.98%55.02%69.48%70.55%3.64%
messagepack:
rmp-serde 1.3.0
4.87%11.58%45.99%63.67%65.32%2.88%
messagepack:
zerompk 0.3.2
27.65%22.92%44.73%63.06%64.61%2.91%
minicbor 1.0.021.06%10.90%45.16%62.94%64.08%2.72%
nachricht-serde 0.4.01.69%7.63%45.35%62.86%63.54%2.81%
nanoserde 0.2.138.86%45.32%44.29%70.78%76.22%3.36%
nibblecode 0.1.0100.00%38.67%51.88%55.76%2.49%
postcard 1.1.127.20%30.06%61.21%74.11%77.08%4.04%
pot 3.0.13.61%4.18%30.81%54.19%61.80%2.14%
protobuf:
prost 0.14.1
9.22%* 5.39%*14.45%43.16%60.03%61.97%2.76%
protobuf:
protobuf 3.7.2
8.61%* 3.85%*10.27%43.16%60.03%61.97%2.74%
rkyv 0.8.1051.50%56.80%* 47.37%*38.67%58.05%66.32%2.59%
ron 0.10.11.15%0.84%9.25%35.96%43.95%0.99%
savefile 0.18.658.12%49.44%44.80%71.21%76.36%3.33%
scale:
parity-scale-codec 3.7.5
16.08%38.05%60.81%75.47%79.42%3.97%
serde-brief 0.1.19.05%5.68%11.55%44.72%51.20%1.48%
serde_bare 0.5.010.50%25.18%60.81%75.59%79.60%3.91%
speedy 0.8.767.97%51.26%50.65%71.73%77.33%3.51%
wincode 0.5.385.11%54.13%44.80%71.21%76.36%3.44%
wiring 0.2.478.13%45.71%44.80%69.43%74.13%3.21%

Zero-copy deserialization speed

CrateAccessReadUpdate
capnp 0.23.21.46%*52.22%*
columnar 0.11.12.15%
flatbuffers 25.12.1949.95%* 0.00%*13.74%* 0.01%*
nibblecode 0.1.099.94%* 0.00%*100.00%* 0.11%*99.12%*
rkyv 0.8.10100.00%* 0.00%*97.76%* 0.09%*100.00%*

Footnotes:

* mouse over for situational details

this deserialization capability is not supported

buffer mutation is not supported (capnp and flatbuffers may but not for rust)