|
| 1 | +<!doctype html> |
| 2 | +<html lang="en"> |
| 3 | +<head> |
| 4 | +<meta charset="utf-8"> |
| 5 | +<meta name="viewport" content="width=device-width, initial-scale=1"> |
| 6 | +<title>Serialization benchmark results</title> |
| 7 | +<style>:root { color-scheme: light dark; font-family: system-ui, sans-serif; } |
| 8 | +body { margin: 2rem; } |
| 9 | +main { margin: auto; max-width: 72rem; } |
| 10 | +nav { display: flex; gap: 1rem; margin-block: 1rem 2rem; } |
| 11 | +.warning { border-left: 0.3rem solid #c47f00; margin: 1.5rem 0; padding: 0.25rem 1rem; } |
| 12 | +.warning h2 { margin-bottom: 0.25rem; } |
| 13 | +.warning p { margin-top: 0; } |
| 14 | +dl { display: grid; gap: 0.25rem 1rem; grid-template-columns: max-content 1fr; } |
| 15 | +dt { font-weight: 700; } |
| 16 | +dd { margin: 0; } |
| 17 | +section { margin-block: 2rem; } |
| 18 | +table { border-collapse: collapse; width: 100%; } |
| 19 | +th, td { border: 1px solid #888; padding: 0.5rem; text-align: left; } |
| 20 | +th { font-weight: 700; } |
| 21 | +</style> |
| 22 | +</head> |
| 23 | +<body> |
| 24 | +<main> |
| 25 | +<h1>Serialization benchmark results</h1> |
| 26 | +<nav aria-label="Benchmark reports"><a href="2026-09-13-cpython-3.14-primitive.html">Primitive results</a> <a href="2026-09-13-cpython-3.14-encoded.html">Encoded results</a></nav> |
| 27 | +<aside class="warning" role="note"><h2>Comparison warning</h2><p>Results from different machines or runs are not directly comparable. pyperf flagged 47 of 48 benchmarks as potentially unstable. This noisy run should not be used for close comparisons.</p></aside> |
| 28 | +<section><h2>Environment</h2><dl><dt>Python</dt><dd>3.14.6 (64-bit) (cpython)</dd> |
| 29 | +<dt>Platform</dt><dd>macOS-15.5-arm64-arm-64bit-Mach-O</dd> |
| 30 | +<dt>CPU model</dt><dd>Unknown</dd> |
| 31 | +<dt>CPU count</dt><dd>8</dd> |
| 32 | +<dt>Git revision</dt><dd>354bbe98fd7fb4a4c22d21509a430bb1931ef752</dd> |
| 33 | +<dt>Benchmark version</dt><dd>0.1.0</dd> |
| 34 | +<dt>GC policy</dt><dd>enabled</dd> |
| 35 | +<dt>Run UTC</dt><dd>2026-09-13T19:45:06.276547+00:00</dd> |
| 36 | +<dt>Unit</dt><dd>second</dd></dl></section> |
| 37 | +<section><h2>Encoded / AVRO / decode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>Avro</td><td>1.12.2</td><td>9.34133 ms</td><td>4.26218 ms</td><td>107.051</td><td>120</td><td></td><td>19413 B</td></tr></tbody></table></section> |
| 38 | +<section><h2>Encoded / AVRO / decode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>Avro</td><td>1.12.2</td><td>110.494 µs</td><td>45.0209 µs</td><td>9050.25</td><td>120</td><td></td><td>153 B</td></tr></tbody></table></section> |
| 39 | +<section><h2>Encoded / AVRO / encode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>Avro</td><td>1.12.2</td><td>14.6538 ms</td><td>4.66952 ms</td><td>68.2415</td><td>120</td><td></td><td>19413 B</td></tr></tbody></table></section> |
| 40 | +<section><h2>Encoded / AVRO / encode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>Avro</td><td>1.12.2</td><td>183.359 µs</td><td>41.3883 µs</td><td>5453.78</td><td>120</td><td></td><td>153 B</td></tr></tbody></table></section> |
| 41 | +<section><h2>Encoded / JSON / decode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th><th scope="col">Speed vs baseline (higher is faster)</th></tr></thead><tbody><tr><td>mashumaro JSON</td><td>3.22</td><td>1.69806 ms</td><td>329.48 µs</td><td>588.907</td><td>120</td><td></td><td>62890 B</td><td>0.77x</td></tr> |
| 42 | +<tr><td>msgspec JSON</td><td>0.21.1</td><td>795.796 µs</td><td>470.457 µs</td><td>1256.6</td><td>120</td><td></td><td>53091 B</td><td>1.63x</td></tr> |
| 43 | +<tr><td>orjson</td><td>3.12.0</td><td>1.13317 ms</td><td>41.8863 µs</td><td>882.481</td><td>120</td><td></td><td>53091 B</td><td>1.15x</td></tr> |
| 44 | +<tr><td>Pydantic v2 JSON</td><td>2.13.5</td><td>1.3676 ms</td><td>295.037 µs</td><td>731.208</td><td>120</td><td></td><td>53091 B</td><td>0.95x</td></tr> |
| 45 | +<tr><td>serpyco-rs JSON</td><td>1.22.0</td><td>506.005 µs</td><td>184.733 µs</td><td>1976.27</td><td>120</td><td></td><td>53091 B</td><td>2.57x</td></tr> |
| 46 | +<tr><td>stdlib json</td><td>3.14.6</td><td>1.29906 ms</td><td>51.655 µs</td><td>769.787</td><td>120</td><td></td><td>53091 B</td><td>1.00x</td></tr></tbody></table></section> |
| 47 | +<section><h2>Encoded / JSON / decode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th><th scope="col">Speed vs baseline (higher is faster)</th></tr></thead><tbody><tr><td>mashumaro JSON</td><td>3.22</td><td>13.7959 µs</td><td>1.89666 µs</td><td>72485.3</td><td>120</td><td></td><td>584 B</td><td>1.06x</td></tr> |
| 48 | +<tr><td>msgspec JSON</td><td>0.21.1</td><td>3.49991 µs</td><td>466.973 ns</td><td>285721</td><td>120</td><td></td><td>487 B</td><td>4.18x</td></tr> |
| 49 | +<tr><td>orjson</td><td>3.12.0</td><td>8.06363 µs</td><td>795.214 ns</td><td>124014</td><td>120</td><td></td><td>487 B</td><td>1.82x</td></tr> |
| 50 | +<tr><td>Pydantic v2 JSON</td><td>2.13.5</td><td>8.20334 µs</td><td>867.558 ns</td><td>121902</td><td>120</td><td></td><td>487 B</td><td>1.78x</td></tr> |
| 51 | +<tr><td>serpyco-rs JSON</td><td>1.22.0</td><td>5.80227 µs</td><td>2.07368 µs</td><td>172346</td><td>120</td><td></td><td>487 B</td><td>2.52x</td></tr> |
| 52 | +<tr><td>stdlib json</td><td>3.14.6</td><td>14.638 µs</td><td>7.98278 µs</td><td>68315.3</td><td>120</td><td></td><td>487 B</td><td>1.00x</td></tr></tbody></table></section> |
| 53 | +<section><h2>Encoded / JSON / encode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th><th scope="col">Speed vs baseline (higher is faster)</th></tr></thead><tbody><tr><td>mashumaro JSON</td><td>3.22</td><td>977.036 µs</td><td>129.412 µs</td><td>1023.5</td><td>120</td><td></td><td>62890 B</td><td>1.58x</td></tr> |
| 54 | +<tr><td>msgspec JSON</td><td>0.21.1</td><td>170.965 µs</td><td>47.4382 µs</td><td>5849.16</td><td>120</td><td></td><td>53091 B</td><td>9.02x</td></tr> |
| 55 | +<tr><td>orjson</td><td>3.12.0</td><td>94.3509 µs</td><td>3.23088 µs</td><td>10598.7</td><td>120</td><td></td><td>53091 B</td><td>16.35x</td></tr> |
| 56 | +<tr><td>Pydantic v2 JSON</td><td>2.13.5</td><td>357.611 µs</td><td>27.5604 µs</td><td>2796.33</td><td>120</td><td></td><td>53091 B</td><td>4.31x</td></tr> |
| 57 | +<tr><td>serpyco-rs JSON</td><td>1.22.0</td><td>228.294 µs</td><td>169.872 µs</td><td>4380.32</td><td>120</td><td></td><td>53091 B</td><td>6.76x</td></tr> |
| 58 | +<tr><td>stdlib json</td><td>3.14.6</td><td>1.54295 ms</td><td>1.79893 ms</td><td>648.107</td><td>120</td><td></td><td>53091 B</td><td>1.00x</td></tr></tbody></table></section> |
| 59 | +<section><h2>Encoded / JSON / encode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th><th scope="col">Speed vs baseline (higher is faster)</th></tr></thead><tbody><tr><td>mashumaro JSON</td><td>3.22</td><td>12.4858 µs</td><td>2.37453 µs</td><td>80091.1</td><td>120</td><td></td><td>584 B</td><td>0.68x</td></tr> |
| 60 | +<tr><td>msgspec JSON</td><td>0.21.1</td><td>1.51777 µs</td><td>122.501 ns</td><td>658861</td><td>120</td><td></td><td>487 B</td><td>5.62x</td></tr> |
| 61 | +<tr><td>orjson</td><td>3.12.0</td><td>930.054 ns</td><td>77.5022 ns</td><td>1.07521e+06</td><td>120</td><td></td><td>487 B</td><td>9.17x</td></tr> |
| 62 | +<tr><td>Pydantic v2 JSON</td><td>2.13.5</td><td>6.0348 µs</td><td>2.04111 µs</td><td>165706</td><td>120</td><td></td><td>487 B</td><td>1.41x</td></tr> |
| 63 | +<tr><td>serpyco-rs JSON</td><td>1.22.0</td><td>3.08171 µs</td><td>1.61473 µs</td><td>324495</td><td>120</td><td></td><td>487 B</td><td>2.77x</td></tr> |
| 64 | +<tr><td>stdlib json</td><td>3.14.6</td><td>8.53035 µs</td><td>1.32526 µs</td><td>117228</td><td>120</td><td></td><td>487 B</td><td>1.00x</td></tr></tbody></table></section> |
| 65 | +<section><h2>Encoded / MESSAGEPACK / decode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>mashumaro MessagePack</td><td>3.22</td><td>1.00587 ms</td><td>331.554 µs</td><td>994.162</td><td>120</td><td></td><td>34653 B</td></tr> |
| 66 | +<tr><td>msgspec MessagePack</td><td>0.21.1</td><td>319.171 µs</td><td>267.792 µs</td><td>3133.11</td><td>120</td><td></td><td>34653 B</td></tr> |
| 67 | +<tr><td>ormsgpack</td><td>1.12.2</td><td>1.49505 ms</td><td>408.054 µs</td><td>668.874</td><td>120</td><td></td><td>34653 B</td></tr> |
| 68 | +<tr><td>serpyco-rs MessagePack</td><td>1.22.0</td><td>240.071 µs</td><td>68.6764 µs</td><td>4165.43</td><td>120</td><td></td><td>34653 B</td></tr></tbody></table></section> |
| 69 | +<section><h2>Encoded / MESSAGEPACK / decode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>mashumaro MessagePack</td><td>3.22</td><td>6.47899 µs</td><td>159.289 ns</td><td>154345</td><td>120</td><td></td><td>274 B</td></tr> |
| 70 | +<tr><td>msgspec MessagePack</td><td>0.21.1</td><td>2.5739 µs</td><td>258.339 ns</td><td>388516</td><td>120</td><td></td><td>274 B</td></tr> |
| 71 | +<tr><td>ormsgpack</td><td>1.12.2</td><td>12.8344 µs</td><td>3.08842 µs</td><td>77915.4</td><td>120</td><td></td><td>274 B</td></tr> |
| 72 | +<tr><td>serpyco-rs MessagePack</td><td>1.22.0</td><td>2.10466 µs</td><td>205.821 ns</td><td>475136</td><td>120</td><td></td><td>274 B</td></tr></tbody></table></section> |
| 73 | +<section><h2>Encoded / MESSAGEPACK / encode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>mashumaro MessagePack</td><td>3.22</td><td>477.639 µs</td><td>75.9269 µs</td><td>2093.63</td><td>120</td><td></td><td>34653 B</td></tr> |
| 74 | +<tr><td>msgspec MessagePack</td><td>0.21.1</td><td>95.1839 µs</td><td>2.53187 µs</td><td>10506</td><td>120</td><td></td><td>34653 B</td></tr> |
| 75 | +<tr><td>ormsgpack</td><td>1.12.2</td><td>228.224 µs</td><td>48.8295 µs</td><td>4381.66</td><td>120</td><td></td><td>34653 B</td></tr> |
| 76 | +<tr><td>serpyco-rs MessagePack</td><td>1.22.0</td><td>98.9967 µs</td><td>30.2495 µs</td><td>10101.3</td><td>120</td><td></td><td>34653 B</td></tr></tbody></table></section> |
| 77 | +<section><h2>Encoded / MESSAGEPACK / encode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>mashumaro MessagePack</td><td>3.22</td><td>4.75235 µs</td><td>462.914 ns</td><td>210422</td><td>120</td><td></td><td>274 B</td></tr> |
| 78 | +<tr><td>msgspec MessagePack</td><td>0.21.1</td><td>1.84773 µs</td><td>232.171 ns</td><td>541206</td><td>120</td><td></td><td>274 B</td></tr> |
| 79 | +<tr><td>ormsgpack</td><td>1.12.2</td><td>3.63077 µs</td><td>1.55775 µs</td><td>275423</td><td>120</td><td></td><td>274 B</td></tr> |
| 80 | +<tr><td>serpyco-rs MessagePack</td><td>1.22.0</td><td>1.09201 µs</td><td>121.661 ns</td><td>915740</td><td>120</td><td></td><td>274 B</td></tr></tbody></table></section> |
| 81 | +<section><h2>Encoded / PICKLE / decode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>pickle</td><td>3.14.6</td><td>777.633 µs</td><td>187.773 µs</td><td>1285.95</td><td>120</td><td></td><td>46842 B</td></tr></tbody></table></section> |
| 82 | +<section><h2>Encoded / PICKLE / decode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>pickle</td><td>3.14.6</td><td>5.59733 µs</td><td>512.613 ns</td><td>178657</td><td>120</td><td></td><td>529 B</td></tr></tbody></table></section> |
| 83 | +<section><h2>Encoded / PICKLE / encode_many / batch 100 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>pickle</td><td>3.14.6</td><td>603.517 µs</td><td>45.4374 µs</td><td>1656.95</td><td>120</td><td></td><td>46842 B</td></tr></tbody></table></section> |
| 84 | +<section><h2>Encoded / PICKLE / encode_one / batch 1 / dataclass</h2><table><thead><tr><th scope="col">Adapter</th><th scope="col">Version</th><th scope="col">Mean</th><th scope="col">Std dev</th><th scope="col">Operations/s</th><th scope="col">Samples</th><th scope="col">Prerelease</th><th scope="col">Payload</th></tr></thead><tbody><tr><td>pickle</td><td>3.14.6</td><td>7.83505 µs</td><td>2.02423 µs</td><td>127632</td><td>120</td><td></td><td>529 B</td></tr></tbody></table></section> |
| 85 | +</main> |
| 86 | +</body> |
| 87 | +</html> |
0 commit comments