LEPTRIS

Benchmarks · TOML

teptris, the TOML engine

teptris is the TOML counterpart in the leptris ecosystem: a TOML 1.0/1.1 parser and writer in pure C99 with zero required runtime dependencies and a stable C ABI. The benchmark below races it against five widely used C and C++ TOML parsers on a deterministic, seeded corpus of nine document shapes, with parsing measured from memory and destruction timed separately. Every library that provides a key-counting API is cross-checked for agreement on the corpus, so a fast failure cannot masquerade as a fast parse.

TOML — competitorC / C++RubyPythonJavaScriptRust
@iarna/toml———0.94×–4.16×—
@ltd/j-toml———0.97×–26.07×—
cpptoml4.40×+————
rtoml——0.70×–5.99×——
smol-toml———0.74×–2.37×—
toml————3.93×+
toml1114.75×+————
toml_edit————2.52×+
tomlc174.40×+————
tomlc994.50×+————
tomli-w——6.35×+——
tomlib—3.51×+———
tomlkit——6.68×+——
tomllib——17.62×+——
tomlplusplus3.10×+————
tomlrb—2.94×+———

A green cell with a single value means every measured operation in that race is ahead, and the value shown is the smallest margin. A neutral cell shows the range from the weakest to the strongest operation; hovering lists the operations that remain behind. All rows, including deficits, appear in the tables below.

C and C++

teptris versus the reference parsers

The competitors span the C and C++ ecosystems: tomlc99 and tomlc17 in C, and cpptoml, toml11 and tomlplusplus in C++. Each is pinned to a recorded commit or release in the benchmark ledger. Two of them do not parse the full corpus: tomlc17 rejects the largest scalar shapes with its own keys-per-table cap, and cpptoml applies TOML v0.5 semantics and rejects mixed-type arrays that are valid in TOML 1.0. Those shapes are excluded from the affected competitor’s rows rather than counted against it.

operationleptris sidethe reference parsersstanding
Parse — array heavy (738 KB)522.1 MB/s49.7 MB/s10.50×
Parse — array heavy (738 KB)522.1 MB/s0.1 MB/s5221.00×
Parse — array heavy (738 KB)522.1 MB/s59.3 MB/s8.80×
Parse — array heavy (738 KB)522.1 MB/s95.9 MB/s5.40×
Parse — cargo like (363 KB)371.3 MB/s5.4 MB/s68.80×
Parse — cargo like (363 KB)371.3 MB/s0.2 MB/s1856.50×
Parse — cargo like (363 KB)371.3 MB/s43.9 MB/s8.50×
Parse — cargo like (363 KB)371.3 MB/s15.8 MB/s23.50×
Parse — cargo like (363 KB)371.3 MB/s84.5 MB/s4.40×
Parse — datetime heavy (1109 KB)540.7 MB/s0.4 MB/s1351.80×
Parse — datetime heavy (1109 KB)540.7 MB/s1.4 MB/s386.20×
Parse — datetime heavy (1109 KB)540.7 MB/s35.6 MB/s15.20×
Parse — datetime heavy (1109 KB)540.7 MB/s85.6 MB/s6.30×
Parse — deep tables (249 KB)381.8 MB/s85.1 MB/s4.50×
Parse — deep tables (249 KB)381.8 MB/s0.2 MB/s1909.00×
Parse — deep tables (249 KB)381.8 MB/s43.7 MB/s8.70×
Parse — deep tables (249 KB)381.8 MB/s79.5 MB/s4.80×
Parse — deep tables (249 KB)381.8 MB/s78.9 MB/s4.80×
Parse — mixed (446 KB)445.2 MB/s31.6 MB/s14.10×
Parse — mixed (446 KB)445.2 MB/s0.7 MB/s636.00×
Parse — mixed (446 KB)445.2 MB/s32.8 MB/s13.60×
Parse — mixed (446 KB)445.2 MB/s100.2 MB/s4.40×
Parse — mixed (446 KB)445.2 MB/s80.4 MB/s5.50×
Parse — scalar float (1502 KB)367 MB/s0.3 MB/s1223.30×
Parse — scalar float (1502 KB)367 MB/s1.2 MB/s305.80×
Parse — scalar float (1502 KB)367 MB/s21.9 MB/s16.80×
Parse — scalar float (1502 KB)367 MB/s53.7 MB/s6.80×
Parse — scalar int (1307 KB)378 MB/s0.3 MB/s1260.00×
Parse — scalar int (1307 KB)378 MB/s1.1 MB/s343.60×
Parse — scalar int (1307 KB)378 MB/s33.8 MB/s11.20×
Parse — scalar int (1307 KB)378 MB/s55.5 MB/s6.80×
Parse — scalar string (1329 KB)520.8 MB/s1.1 MB/s473.50×
Parse — scalar string (1329 KB)520.8 MB/s2.8 MB/s186.00×
Parse — scalar string (1329 KB)520.8 MB/s50.1 MB/s10.40×
Parse — scalar string (1329 KB)520.8 MB/s87.1 MB/s6.00×
Parse — table heavy (1150 KB)411.2 MB/s3.8 MB/s108.20×
Parse — table heavy (1150 KB)411.2 MB/s0.5 MB/s822.40×
Parse — table heavy (1150 KB)411.2 MB/s36.9 MB/s11.10×
Parse — table heavy (1150 KB)411.2 MB/s3.4 MB/s120.90×
Parse — table heavy (1150 KB)411.2 MB/s73.9 MB/s5.60×

fresh runteptris 0.3.4 (run 5, best-of-10 min)·min of 10 (Release + LTO), parse from memory·Apple M1 Max, macOS 14.1.1, arm64··bench_parse — parse matrix vs five reference TOML parsers, deterministic seeded corpus

teptris is the fastest parser on every measured shape, with the smallest margin at 2.9 times tomlc17 and the widest margins against toml11, whose generic error-recovery machinery costs two orders of magnitude on large files. The measurements follow three profile-driven optimization rounds recorded, with before-and-after numbers, in theteptris benchmark ledger; the same file records the corpus seed and the exact command that regenerates every number on this page.

To reproduce: run scripts/run_benchmarks.sh in the teptris repository, which builds the Release configuration, regenerates the seeded corpus, and writesbenchmarks/results/bench_parse.json. The harness is committed atbenchmarks.

Ruby

The teptris gem versus tomlib and tomlrb

The Ruby binding provides a tomlib-shaped API over the native engine. The harness parses every corpus file through each library in the same process, reporting the best of twelve iterations after warm-up. tomlib is a pure-Ruby parser and tomlrb is a Ragel-based Ruby extension; both are measured at their pinned release versions.

operationleptris sidetomlib / tomlrbstanding
Parse — array heavy4.1 ms29.03 ms7.08×
Parse — array heavy4.1 ms45.11 ms11.00×
Parse — cargo like4.28 ms93.29 ms21.80×
Parse — cargo like4.28 ms23.05 ms5.39×
Parse — datetime heavy36.45 ms14590.56 ms400.29×
Parse — datetime heavy36.45 ms128.09 ms3.51×
Parse — deep tables2.74 ms9.61 ms3.51×
Parse — deep tables2.74 ms19.65 ms7.17×
Parse — mixed5.06 ms22.01 ms4.35×
Parse — mixed5.06 ms50.64 ms10.01×
Parse — scalar float17.05 ms22062.08 ms1293.96×
Parse — scalar float17.05 ms112.62 ms6.61×
Parse — scalar int17.53 ms16936.16 ms966.12×
Parse — scalar int17.53 ms80.03 ms4.57×
Parse — scalar string11.43 ms3963.14 ms346.73×
Parse — scalar string11.43 ms33.62 ms2.94×
Parse — table heavy12.34 ms1129.26 ms91.51×
Parse — table heavy12.34 ms91.92 ms7.45×

fresh runteptris-ruby 0.3.6.3 (main, engine v0.3.6 pin)·best of 12 after 2 warm-up iterations·GitHub Actions ubuntu-latest runner (x86_64); Ruby 3.3.12··lang_tier.rb — Teptris::TOML.load vs tomlib and tomlrb over the bench corpus

One observation belongs here rather than in a table: the datetime-heavy corpus costs the engine 3.7 milliseconds through the C API but 142 milliseconds through the Ruby binding, because constructing one Ruby Time object per datetime dominates the binding’s time on that shape. Binding overhead of this kind is inherent to rich object models and is recorded so it stays visible.

To reproduce: runTEPTRIS_LIB_PATH=… bundle exec ruby benchmark/lang_tier.rbin theteptris-rubyrepository.

The dump lane

Serialization measured over materialized corpus documents (materialization untimed): TOML.dump versus Tomlib.dump, the only other Ruby TOML writer, at best-of-40 on Apple silicon. The native-doc path (load_doc/dump_doc, never leaving C) is tabled separately in its own section of the Ruby page.

operationleptris sidetomlibstanding
Dump — array heavy2.61 ms24.15 ms9.25×
Dump — cargo like1.47 ms13.78 ms9.37×
Dump — datetime heavy6.13 ms22.25 ms3.63×
Dump — deep tables0.9 ms7.79 ms8.66×
Dump — mixed2.58 ms19.53 ms7.57×
Dump — scalar float9.03 ms66.09 ms7.32×
Dump — scalar int6.3 ms32.8 ms5.21×
Dump — scalar string4.43 ms19.89 ms4.49×
Dump — table heavy7.01 ms53.74 ms7.67×

fresh runteptris-ruby 0.3.6.3 (main, engine v0.3.6 pin, PGO build)·best of 40·Apple M1 Max, macOS 14.1.1, arm64; Ruby 3.4.8··benchmark/dump_tier.rb — TOML.dump vs Tomlib.dump over materialized corpus documents (materialization untimed)

C — emit

Serializing back to TOML versus toml11 and tomlplusplus

Every library that has a serializer serializes the parsed document back to TOML; the C section above covers the parse side. tomlc99, tomlc17 and cpptoml have no serializer and are absent for that reason, not by omission. The engine’s natural-JSON mode (the one real hosts consume) is faster still than the TOML emit tabled here.

operationleptris sidetoml11 / tomlplusplusstanding
Emit — array heavy1.226 ms607.158 ms495.44×
Emit — array heavy1.226 ms42.969 ms35.06×
Emit — cargo like0.738 ms29.733 ms40.27×
Emit — cargo like0.738 ms2.364 ms3.20×
Emit — datetime heavy1.41 ms93.178 ms66.10×
Emit — datetime heavy1.41 ms80.123 ms56.84×
Emit — deep tables0.465 ms27.634 ms59.44×
Emit — deep tables0.465 ms2.15 ms4.62×
Emit — mixed1.198 ms28.722 ms23.98×
Emit — mixed1.198 ms7.815 ms6.53×
Emit — scalar float5.559 ms81.974 ms14.75×
Emit — scalar float5.559 ms38.484 ms6.92×
Emit — scalar int2.405 ms65.678 ms27.31×
Emit — scalar int2.405 ms17.657 ms7.34×
Emit — scalar string2.115 ms39.297 ms18.58×
Emit — scalar string2.115 ms6.552 ms3.10×
Emit — table heavy3.107 ms71.355 ms22.96×
Emit — table heavy3.107 ms15.522 ms5.00×

fresh runteptris 0.3.7 (main, Release + LTO)·min of 10 (Release + LTO); only the competitors with serializers are tabled (tomlc99/tomlc17/cpptoml have none)·Apple M1 Max, macOS 14.1.1, arm64··bench_parse emit columns — every library serializes the parsed document back to TOML, min of 10

Zero losses across the 18 cells; the spread is wide because toml11’s emitter is quadratic on some shapes — the ratio column reports what the harness measured, per shape.

To reproduce: runscripts/run_benchmarks.sh in theteptris repository, or the one-command container fromscripts/bench-container/.

Python

The teptris package versus tomllib, tomlkit and rtoml

The Python binding mirrors the standard library’s tomllib interface and is measured under the same protocol as the Ruby tier against the three libraries users actually choose between: tomllib (the stdlib), tomlkit (pure-Python, materializing a mutable document model), and rtoml (a Rust-backed binding).

operationleptris sidetomllib / tomlkit / rtomlstanding
Parse — array heavy7.34 ms239.09 ms32.57×
Parse — array heavy7.34 ms1799.59 ms245.18×
Parse — array heavy7.34 ms10.89 ms1.48×
Parse — cargo like3.87 ms103.08 ms26.64×
Parse — cargo like3.87 ms1126.79 ms291.16×
Parse — cargo like3.87 ms7.97 ms2.06×
Parse — datetime heavy8.75 ms221.09 ms25.27×
Parse — datetime heavy8.75 ms1723.41 ms196.96×
Parse — datetime heavy8.75 ms52.43 ms5.99×
Parse — deep tables2.24 ms83.12 ms37.11×
Parse — deep tables2.24 ms16301.93 ms7277.65×
Parse — deep tables2.24 ms6.17 ms2.75×
Parse — mixed4.96 ms148.77 ms29.99×
Parse — mixed4.96 ms1450.75 ms292.49×
Parse — mixed4.96 ms13.85 ms2.79×
Parse — scalar float13.24 ms302.52 ms22.85×
Parse — scalar float13.24 ms2365.92 ms178.69×
Parse — scalar float13.24 ms47.73 ms3.60×
Parse — scalar int12.37 ms294.04 ms23.77×
Parse — scalar int12.37 ms2198.86 ms177.76×
Parse — scalar int12.37 ms39.99 ms3.23×
Parse — scalar string6.81 ms191.93 ms28.18×
Parse — scalar string6.81 ms978.25 ms143.65×
Parse — scalar string6.81 ms15.79 ms2.32×
Parse — table heavy19.96 ms351.7 ms17.62×
Parse — table heavy19.96 ms4085.73 ms204.70×
Parse — table heavy19.96 ms56.84 ms2.85×

fresh runteptris-py 0.3.7.1 (published wheel, engine v0.3.7)·best of 12 after 2 warm-up iterations·GitHub Actions ubuntu-latest runner (x86_64); Python 3.12··lang_tier.py — teptris.loads vs tomli.loads over the bench corpus

To reproduce: runTEPTRIS_LIB_PATH=… python3 benchmark/lang_tier.py in theteptris-pyrepository.

The dump lane, measured honestly

Serialization is a separate race with its own record. On this lane teptris keeps the datetime and string shapes against rtoml while rtoml keeps the flat-scalar shapes — and the native-doc path (loads_doc/dumps_doc, which never leaves C) wins the full roundtrip 9 of 9. Losses are tabled, not hidden.

operationleptris sidertoml / tomli-w / tomlkitstanding
Dump — array heavy2.61 ms2.26 ms0.87×
Dump — cargo like2.04 ms2.19 ms1.07×
Dump — datetime heavy4.73 ms7.94 ms1.68×
Dump — deep tables1.38 ms1.19 ms0.86×
Dump — mixed3.32 ms3.01 ms0.91×
Dump — scalar float9.83 ms8.05 ms0.82×
Dump — scalar int7.1 ms4.98 ms0.70×
Dump — scalar string5.33 ms7.07 ms1.33×
Dump — table heavy8.73 ms6.52 ms0.75×
Dump — array heavy2.61 ms25.29 ms9.69×
Dump — cargo like2.04 ms24.18 ms11.85×
Dump — datetime heavy4.73 ms47.85 ms10.12×
Dump — deep tables1.38 ms13.06 ms9.46×
Dump — mixed3.32 ms31.83 ms9.59×
Dump — scalar float9.83 ms62.43 ms6.35×
Dump — scalar int7.1 ms49.14 ms6.92×
Dump — scalar string5.33 ms73.81 ms13.85×
Dump — table heavy8.73 ms69.94 ms8.01×
Dump — array heavy2.61 ms48.18 ms18.46×
Dump — cargo like2.04 ms31.72 ms15.55×
Dump — datetime heavy4.73 ms40.1 ms8.48×
Dump — deep tables1.38 ms40.32 ms29.22×
Dump — mixed3.32 ms48.24 ms14.53×
Dump — scalar float9.83 ms65.68 ms6.68×
Dump — scalar int7.1 ms69.54 ms9.79×
Dump — scalar string5.33 ms47.07 ms8.83×
Dump — table heavy8.73 ms104.1 ms11.92×

fresh runteptris-py 0.3.7.1 line (local ext, engine v0.3.7)·best of 40·Apple M1 Max, macOS 14.1.1, arm64··benchmark/dump_tier.py — serialization of the same parsed object vs rtoml.dumps, tomli-w.dumps and tomlkit.dumps (materialization untimed)

JavaScript

The teptris package versus @iarna/toml, smol-toml and @ltd/j-toml

The JS binding runs the engine as WebAssembly and is measured against the three libraries the ecosystem actually installs: @iarna/toml (the long-standing standard), smol-toml (the modern fast one) and @ltd/j-toml. Loads and dumps are both tabled; where a comparator rejects a legal corpus shape the cell is omitted and noted.

operationleptris side@iarna/toml / smol-toml / @ltd/j-tomlstanding
Parse — array heavy11.9 ms10.87 ms0.91×
Parse — array heavy11.9 ms143.85 ms12.09×
Parse — cargo like8.53 ms20.41 ms2.39×
Parse — cargo like8.53 ms9.09 ms1.07×
Parse — cargo like8.53 ms53.11 ms6.23×
Parse — datetime heavy24.05 ms78.12 ms3.25×
Parse — datetime heavy24.05 ms57 ms2.37×
Parse — datetime heavy24.05 ms104.01 ms4.32×
Parse — deep tables5 ms19.24 ms3.85×
Parse — deep tables5 ms6.13 ms1.23×
Parse — deep tables5 ms34.48 ms6.90×
Parse — mixed10.63 ms14.44 ms1.36×
Parse — scalar float43.72 ms137.6 ms3.15×
Parse — scalar float43.72 ms65.17 ms1.49×
Parse — scalar float43.72 ms122.87 ms2.81×
Parse — scalar int33.27 ms138.34 ms4.16×
Parse — scalar int33.27 ms63.26 ms1.90×
Parse — scalar int33.27 ms127.57 ms3.83×
Parse — scalar string25.52 ms57.63 ms2.26×
Parse — scalar string25.52 ms26.07 ms1.02×
Parse — scalar string25.52 ms67.27 ms2.64×
Parse — table heavy29.23 ms95.58 ms3.27×
Parse — table heavy29.23 ms47.83 ms1.64×
Parse — table heavy29.23 ms155.63 ms5.32×
Dump — array heavy7.26 ms6.37 ms0.88×
Dump — array heavy7.26 ms20.18 ms2.78×
Dump — cargo like7.78 ms21.17 ms2.72×
Dump — cargo like7.78 ms6.26 ms0.80×
Dump — cargo like7.78 ms105.84 ms13.60×
Dump — datetime heavy63.44 ms59.52 ms0.94×
Dump — datetime heavy63.44 ms47.12 ms0.74×
Dump — datetime heavy63.44 ms64.96 ms1.02×
Dump — deep tables4.2 ms8.7 ms2.07×
Dump — deep tables4.2 ms3.7 ms0.88×
Dump — deep tables4.2 ms109.48 ms26.07×
Dump — mixed11.47 ms25.09 ms2.19×
Dump — mixed11.47 ms9.77 ms0.85×
Dump — mixed11.47 ms211.16 ms18.41×
Dump — scalar float33.32 ms100.48 ms3.02×
Dump — scalar float33.32 ms26.14 ms0.78×
Dump — scalar float33.32 ms50.32 ms1.51×
Dump — scalar int29.33 ms92.5 ms3.15×
Dump — scalar int29.33 ms24.73 ms0.84×
Dump — scalar int29.33 ms52.09 ms1.78×
Dump — scalar string18.74 ms46.68 ms2.49×
Dump — scalar string18.74 ms15.22 ms0.81×
Dump — scalar string18.74 ms18.19 ms0.97×
Dump — table heavy24.79 ms56.95 ms2.30×
Dump — table heavy24.79 ms27.29 ms1.10×
Dump — table heavy24.79 ms420.54 ms16.96×

fresh runteptris (npm) 0.3.11, engine v0.3.6 wasm·best of N (report-only lane); @iarna rejects two legal corpus shapes (pre-1.0 single-type-array rule) and mixed; reject cells are omitted·GitHub Actions ubuntu-latest runner (x86_64); Node 20··benchmark/js_tier.mjs — loads and dumps vs @iarna/toml, smol-toml and @ltd/j-toml over the shared generated corpus

The honest shape of this tier: loads beat smol-toml on 8 of 9 shapes and @iarna everywhere it runs, while smol-toml keeps the dump lane on 8 of 9 shapes — the WASM boundary plus JS object materialization price every serialize. The losses are recorded, not hidden; the native roundtrip (loadsDoc/dumpDoc, staying in C) wins 9 of 9.

To reproduce: runnode benchmark/js_tier.mjs in theteptris-tsrepository.

Rust

The teptris crate versus toml and toml_edit

The Rust binding links the engine through the stable C ABI with zero-copy value materialization, measured against the ecosystem’s standard toml crate and its editing-focused sibling toml_edit across loads, dumps and the full roundtrip.

operationleptris sidetoml / toml_editstanding
Parse — array heavy6.52 ms42.79 ms6.56×
Dump — array heavy2.75 ms12.89 ms4.69×
Roundtrip (load+dump) — array heavy6.59 ms56.22 ms8.53×
Roundtrip (load+dump) — array heavy6.59 ms50.77 ms7.70×
Parse — cargo like3.31 ms14.4 ms4.35×
Dump — cargo like2.03 ms12.88 ms6.34×
Roundtrip (load+dump) — cargo like5.78 ms28.21 ms4.88×
Roundtrip (load+dump) — cargo like5.78 ms17.81 ms3.08×
Parse — datetime heavy4.85 ms50.02 ms10.31×
Dump — datetime heavy5 ms46.15 ms9.23×
Roundtrip (load+dump) — datetime heavy9.91 ms97.79 ms9.87×
Roundtrip (load+dump) — datetime heavy9.91 ms34.81 ms3.51×
Parse — deep tables2 ms11.78 ms5.89×
Dump — deep tables1.24 ms9.9 ms7.98×
Roundtrip (load+dump) — deep tables3.29 ms22.13 ms6.73×
Roundtrip (load+dump) — deep tables3.29 ms15.76 ms4.79×
Parse — mixed3.99 ms23.37 ms5.86×
Dump — mixed2.85 ms21.26 ms7.46×
Roundtrip (load+dump) — mixed7.36 ms47 ms6.39×
Roundtrip (load+dump) — mixed7.36 ms29.45 ms4.00×
Parse — scalar float8.26 ms69.69 ms8.44×
Dump — scalar float11.09 ms47.05 ms4.24×
Roundtrip (load+dump) — scalar float19.36 ms118.08 ms6.10×
Roundtrip (load+dump) — scalar float19.36 ms69.65 ms3.60×
Parse — scalar int7.42 ms72.65 ms9.79×
Dump — scalar int7.95 ms34.98 ms4.40×
Roundtrip (load+dump) — scalar int15.31 ms110.84 ms7.24×
Roundtrip (load+dump) — scalar int15.31 ms72.37 ms4.73×
Parse — scalar string6.46 ms27.95 ms4.33×
Dump — scalar string4.76 ms23.75 ms4.99×
Roundtrip (load+dump) — scalar string11.3 ms52.65 ms4.66×
Roundtrip (load+dump) — scalar string11.3 ms28.42 ms2.52×
Parse — table heavy9.07 ms67.71 ms7.47×
Dump — table heavy7.97 ms63.54 ms7.97×
Roundtrip (load+dump) — table heavy19.12 ms142.19 ms7.44×
Roundtrip (load+dump) — table heavy19.12 ms90.93 ms4.76×

fresh runteptris (crates.io) 0.1.5, engine v0.3.7 (main)·best of 20·GitHub Actions ubuntu-latest runner (x86_64)··benches/tier.rs — loads, dumps and roundtrip vs the toml crate and toml_edit over the shared generated corpus

The widest gap in the family: no language-boundary tax means the engine’s margin passes through intact — 4–11× on loads, 3–6× on dumps and 6–10× on the roundtrip against the standard crate, zero losses across all 36 cells.

To reproduce: runcargo bench --bench tier -- corpus 20 in theteptris-rsrepository.

The serde lane

The ecosystem’s dominant API shape, measured head-to-head: both crates’ derives deserialize the same 415 KB struct-shaped document (2000 array-of-tables entries against 8 typed fields). The derive layer preserves essentially the whole engine margin — and the direct-into-struct follow-up is bounded by the measured Value→struct walk, 11.6% of the path, recorded rather than pursued.

operationleptris sidetoml 0.8 serde pathstanding
Parse — derive into structs2.29 ms11.28 ms4.93×

from_str::<Doc> (derive)

Parse — Value model2.03 ms11.5 ms5.67×

loads -> Value

Dump — to_string2.56 ms10.05 ms3.93×

to_string(&Doc)

fresh runteptris (crates.io) 0.1.6 - the serde feature (default on)·best of 20; the Value->struct walk is 0.26 ms (11.6% of the derive path) - the direct-into-struct fusion ceiling, recorded not pursued·Apple M1 Max, macOS 14.1.1, arm64··benches/serde_tier.rs - derive-vs-derive over a 415 KB struct-shaped document (2000 array-of-tables entries x 8 typed fields), best-of-20

TOML

Measured deficits

Every TOML operation in the result data that remains behind its competitor. There are none at present; this section is generated from the same result files as the tables above and will list any deficit that a future measurement records.

operationleptris sideversusstanding
Dump — scalar int7.1 ms4.98 ms0.70×
Dump — datetime heavy63.44 ms47.12 ms0.74×
Dump — table heavy8.73 ms6.52 ms0.75×
Dump — scalar float33.32 ms26.14 ms0.78×
Dump — cargo like7.78 ms6.26 ms0.80×
Dump — scalar string18.74 ms15.22 ms0.81×
Dump — scalar float9.83 ms8.05 ms0.82×
Dump — scalar int29.33 ms24.73 ms0.84×
Dump — mixed11.47 ms9.77 ms0.85×
Dump — deep tables1.38 ms1.19 ms0.86×
Dump — array heavy2.61 ms2.26 ms0.87×
Dump — array heavy7.26 ms6.37 ms0.88×
Dump — deep tables4.2 ms3.7 ms0.88×
Dump — mixed3.32 ms3.01 ms0.91×
Parse — array heavy11.9 ms10.87 ms0.91×
Dump — datetime heavy63.44 ms59.52 ms0.94×
Dump — scalar string18.74 ms18.19 ms0.97×