docs: add the blog post "How nlohmann/json 3.13.0 got 3× faster" (#6022)

* docs: add the blog post "How 3.13.0 got faster"

A post for the documentation (Home > Blog) on how 3.13.0 became faster:
eight themes with the pull requests behind them, the ideas taken from other
libraries, what did not work, how the fast paths are tested, and the
compile-time cost. Every number comes from a run on 2026-10-27 (3.12.0 against
develop plus the open non-draft PRs, Apple M1 Max) or from the linked PR.

- docs/mkdocs/docs/home/blog/how_3_13_0_got_faster.md: the post.
- docs/mkdocs/scripts/figures/perf_blog.py: draws its 12 figures (overview,
  eight timeline panels, the SWAR test, the cliffs, json_view throughput) as
  inline SVGs in the nj-charts style; data/perf_timeline.csv holds the
  timeline.
- tests/benchmarks/history: history.cpp and history.py time one fixed program
  against the header of every commit that changed it, interleaved, and write
  one CSV row per commit with its PR. The timeline of the post comes from it.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: compare json_document with Glaze, sonic, RapidJSON and Rust parsers

Extends the comparison in "How 3.13.0 got faster" from yyjson, simdjson and
Boost.JSON to eleven engines: sonic-cpp, RapidJSON and Glaze (generic DOM,
lazy_json, reading into structs) in C++, sonic-rs, simd-json and serde_json in
Rust. Measured on an Apple M1 Max (Apple clang 21, Rust 1.99) and an x86-64
Haswell server (GCC 13, Clang 18). Every engine must return the same values,
string bytes and bit-identical number sums before it is timed.

The post now answers whether json_document is the fastest parser: it is the
fastest document parser at parse+dump everywhere and at parsing on Apple
silicon, ties with simdjson's DOM on x86-64, and loses to simdjson On-Demand
and Glaze structs when only a few fields are read.

tests/benchmarks/json_view/others holds the programs (bench_all.cpp, the Rust
crate with its Cargo.lock), summarize.py and the pinned versions and checksums.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: captions, test-file table and figure fixes for the 3.13.0 post

- caption every table and figure
- describe what makes twitter.json, citm_catalog.json, canada.json and
  jeopardy.json hard, and what each timeline panel exercises
- split the json_view layout figure into the tree and the index, with
  the example text above; fix the arrows into the string boxes
- arrows and a "less is better" axis label in the cliffs figure
- name nlohmann/json in the comparison tables and chart
- licenses of the adapted code in the thanks section

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: byline and licenses for the 3.13.0 post

- author and date below the title, styled as .nj-byline; its link gets
  no external-link icon
- the license of every library in the thanks section, checked against
  each project's license files; credit sonic-rs for QUOTE_TAB, which
  orjson adapted from it

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: dump comparison and split acknowledgments in the 3.13.0 post

- a dump workload in bench_all and bench_rs: each engine writes a
  document parsed beforehand, and every output must read back with
  bit-identical numbers; an optional argument selects one workload
- the post's comparison gains a write table, a throughput chart, a dump
  row for all three configurations, and the x86-64 cases it loses
- the thanks section is split into adapted code and borrowed ideas

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: x86-64 dump numbers with #5908's branch-free token digits

The dump of canada.json with GCC on x86-64 lost to yyjson by 0.78 because
GCC compiled #5908's token-digit selections as branches; 9fad526888 fixed
that. The post's x86-64 dump and parse+dump rows of canada.json are now
measured with it (GCC 0.95, Clang 0.91 against yyjson), theme 5 tells the
story, and "How we measured" says which rows include the commit.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* Compare JSON libraries by use case in the json_view harness

bench_all and bench_rs now time use cases (validate, sum, select, edit,
minify, write) instead of library functions. Every library may solve a
use case in every way it offers; each variant's result is checked, and
three malformed inputs give its validation level (full, no UTF-8,
partial). summarize.py reports each library's fastest fully validating
variant and a faster one at a lower level, as text and as JSON.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: restructure the 3.13.0 post around themes and use cases

- deeper technical detail and code in the eight themes; pull request
  numbers move to the appendix, timeline steps are labelled by theme
- comparison with other libraries by use case, as heatmaps per
  platform, with validation levels and the caveats next to the results
- appendix: test files, all 182 suite rows with a histogram, timeline
  steps, algorithmic fixes, per-file tables, behaviour changes, setup,
  pull requests by theme

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* Measure each library's fastest modes in the json_view harness

Address the points of a review from the other libraries' side:

- simdjson 5.0.8 (On-Demand structs, key selectors) and Glaze 9.1.0
- number-skipping modes: yyjson and RapidJSON raw numbers, Boost.JSON
  number_precision::none
- reused parsers and allocators for yyjson, RapidJSON and Boost.JSON
- Boost.JSON parse_into, Glaze generic with double numbers, and the
  same struct types for nlohmann, Glaze, simdjson and serde
- minified copies of twitter.json and citm_catalog.json
- a fourth probe (trailing garbage) and Glaze "(strict)" variants
- a new random variant order in every round, as a variant's time could
  depend on the one before it by up to 15 % on the Mac
- --files for other test files and --conformance for JSONTestSuite,
  with conformance-rs.sh for the Rust program

summarize.py also reports each library's best reused variant.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: rerun the library comparison of the 3.13.0 post with fairer rules

The figures and Appendix E use the reruns with each library's fastest
modes. Skipping number conversion while reading is now allowed for
every library; copying number text is still not chosen when writing.

The text now says who set the rules, where libraries that check less
win select, how minified files change the picture, and that the
reused jeopardy.json claim holds with every library reused. A new
section covers 19 held-out files and JSONTestSuite, including where
json_document loses, and lists what was not measured. Every
comparison number was recomputed; Glaze is credited in the intro.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: measure the 3.13.0 post against develop with #5964 and #5908

The suite (Appendix B, the short-version table, the overview and distribution
figures) and the timeline endpoint now measure develop d20c4dcd89 with #5964
and #5908 merged. The geometric mean stays 2.9x (2.95); Dump/signed_ints and
Dump/unsigned_ints gain 1.5x and 2.1x from #5964; GetVectorDouble/floats drops
from 10.3x to 7.0x because the old candidate's suite binary happened to compile
that loop faster (a standalone build takes 0.97 ms with both headers).

The timeline endpoint is the 10-27 value scaled by the ratio of the new to the
old candidate, both measured on 10-30, so that it stays comparable with the
other points of the timeline.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: add three figures to the 3.13.0 post

- short strings: two overlapping 16-byte loads and stores
- eight digits at a time: the three multiplications, lane by lane
- validate on the 19 held-out files, per file, Mac and x86-64

The prose the figures replace is trimmed.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: measure the 3.13.0 post against develop with all open pull requests

The baseline is now develop 9c349b1d7c with every open non-draft pull
request merged, including #5968, #5970, #5971, #5975, #5976, #5978,
#5979, #5980, #5981 and #5982. The suite was rerun on 11-01 with every
step repeated when the load rose above 5 while it ran; the comparison
with other libraries and the held-out files were rerun on 10-31.

- suite: 3.0x geometric mean (median 2.9x); Appendix B, the overview
  and the distribution regenerated
- timeline endpoint, Appendix D and the cliffs figure updated
- the held-out figure compares json_document with the fastest other
  library
- new paragraphs for the pull requests listed above

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: measure the 3.13.0 post against develop with the open pull requests of 11-02

Suite, timeline endpoint, Appendix D and the scalar-run numbers now come from
develop b2674a4a2f with #5990, #5991, #5992, #5996, #5997, #5998, #5999 and
#6000 merged. The scalar runs are measured against a build without them on
develop's code, which no longer checks for a scalar before entering the loop.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: measure the 3.13.0 post against develop with all open pull requests of 11-02

Suite, timeline endpoint, Appendix D and the scalar-run numbers now come from
develop b2674a4a2f with #5990-#5992, #5996-#6006 and #6008 merged. With #6008,
arrays of one element skip the scalar run, so nested arrays no longer pay for
it. The suite ran three rounds per version; the round of 3.12.0 and of 3.13.0
that differed from the other two was dropped, as the setup table says.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: fix the facts the review of the 3.13.0 post found wrong or imprecise

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: re-measure the 3.13.0 post and apply the review

Measure everything again against develop with the open pull requests of
11-03 (suite, timeline, comparison on the Mac and on x86-64, compile
times, stream gap), add the suite on an Intel MacBook Pro as a check,
mark the ways that keep number text as "N" in the use-case charts, move
the loop-shape box to theme 5, and apply the style and wording fixes of
the review.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: make the comparison of the 3.13.0 post fairer

Three reviews of "How it compares" (a maintainer audit of the harness, a
methodology review, a reader's red team) led to a full rerun on the Mac and
x86-64 with simdjson 5.1.1 and new ways in the harness:

- in-place parses with the copy made before the timer ("(copy untimed)",
  never chosen as a library's best) and json_document::parse_copy();
- RapidJSON through StringStream, and with default precision in validate,
  which reads no number;
- BENCH_ONLY takes several prefixes.

The post now gives the copy's real cost (11-14 us for twitter.json on the
Mac, not 30), what yyjson gains without it, the run-to-run noise, the LTO
check, the single-file losses that were missing, and qualifies the headline
claim. Every number in the section and Appendix E is recomputed; the
NUL-byte remark moved out of the body.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* Format bench_all.cpp with astyle

The amalgamation check runs astyle over tests/ and failed on bench_all.cpp. The variant tables keep one variant per
line between *INDENT-OFF* and *INDENT-ON*; astyle formats the rest, and the list of use cases becomes a named array so
the loop header stays on one line.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* Print the history benchmark's results with a stream

Flawfinder flagged the printf in history.cpp (CWE-134), although its format string is a constant. The stream prints the
same text, so history.py reads it as before.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: address review comments on the performance blog post

- fix wording: "are new", "for each input source", "the strings", "the last zero to seven bytes", "by" Danila
  Kutenin, "the result of that query"
- introduce `json_document` where it first gets a detail, say that the `-mbranches` flag is not used, explain
  why the position and token bookkeeping overloads are empty, and say that a step's percentage is relative to
  the time before the step and that a median of 4 is the mean of the two middle values
- write percentages without a space before `%` in the post and in the price figure (regenerated)

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: wrap the prose of the performance blog post at 120 columns

Only line breaks change: the rendered page is identical after whitespace normalization.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: blog post: address the second round of review comments

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: blog post: note that Boost.JSON's tree lead comes from its arena

The comparison builds Boost.JSON's tree in a monotonic_resource. With its
default allocator and precise numbers, boost::json::parse() takes as long
as json::parse() on twitter.json, 5% longer on citm_catalog.json and 17%
less time on canada.json (M1, C++23 -O3, best of 3 x 30 runs; the arena
saves Boost.JSON 28-41%).

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: blog post: comparing already passes the depth; copying measured slower without the counter

operator== walks the standard containers itself and passes the depth as an
argument (#5840). A copy that does the same, inserting element by element,
measured 4-16% slower on an M1 Max with Apple clang, so copying keeps the
thread_local counter.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

* docs: blog post: name every user of the depth counter and every input the document copies

The "Bounded recursion" paragraph said only copying and equality for custom
containers use the thread_local counter. Converting from another basic_json
specialization and the ordering comparisons use it too; equality for the
standard containers passes the depth instead.

The "Strings stay in the input" bullet named only parse_copy() and an rvalue
std::string as owning inputs. Streams, FILE* and other input that is not one
contiguous block of bytes are read into an owned buffer as well.

Signed-off-by: Niels Lohmann <mail@nlohmann.me>

---------

Signed-off-by: Niels Lohmann <mail@nlohmann.me>
This commit is contained in:
Niels Lohmann authored and GitHub committed 2026-11-09 08:11:10 +01:00
1 parent 6343775000
commit 2c7474affc
51 files changed
+73792 -18

No files matched your search

@@ -0,0 +1,183 @@
benchmark,unit,3.12.0,3.13.0,speedup
Accept/canada,ns,1.29488e+07,2.3494e+06,5.512
Accept/citm_catalog,ns,6.53091e+06,923408,7.073
Accept/floats,ns,1.15702e+08,2.26771e+07,5.102
Accept/jeopardy,ns,2.20758e+08,5.92935e+07,3.723
Accept/signed_ints,ns,1.17358e+08,2.82947e+07,4.148
Accept/small_signed_ints,ns,5.75113e+07,1.80352e+07,3.189
Accept/twitter,ns,2.51345e+06,483792,5.195
Accept/unsigned_ints,ns,1.16297e+08,2.97181e+07,3.913
BinaryToCbor/1024,ns,298.444,107.095,2.787
BinaryToCbor/128,ns,248.661,116.711,2.131
BinaryToCbor/16,ns,244.687,49.6325,4.930
BinaryToCbor/16384,ns,952.115,413.62,2.302
BinaryToCbor/2048,ns,328.419,125.183,2.624
BinaryToCbor/256,ns,264.678,90.8937,2.912
BinaryToCbor/32,ns,251.632,50.4059,4.992
BinaryToCbor/32768,ns,1541.05,802.721,1.920
BinaryToCbor/4096,ns,406.957,177.412,2.294
BinaryToCbor/512,ns,289.876,102.063,2.840
BinaryToCbor/64,ns,254.928,84.6434,3.012
BinaryToCbor/8,ns,247.618,49.3761,5.015
BinaryToCbor/8192,ns,514.281,256.456,2.005
Copy/canada,ns,3.78116e+06,2.92734e+06,1.292
Copy/citm_catalog,ns,1.7026e+06,1.51108e+06,1.127
Copy/twitter,ns,840201,767400,1.095
CopyAssign/canada,ns,3.86416e+06,2.94449e+06,1.312
CopyAssign/citm_catalog,ns,1.76529e+06,1.58608e+06,1.113
CopyAssign/twitter,ns,884985,790724,1.119
CopyOnly/canada,ns,1.60229e+06,1.57507e+06,1.017
CopyOnly/citm_catalog,ns,786244,817481,0.962
CopyOnly/twitter,ns,423631,420649,1.007
CopyRing/canada,ns,3.86433e+06,2.99657e+06,1.290
CopyRing/citm_catalog,ns,1.84434e+06,1.60579e+06,1.149
CopyRing/twitter,ns,951510,818035,1.163
DestroyOnly/canada,ns,2.22138e+06,1.40157e+06,1.585
DestroyOnly/citm_catalog,ns,926244,711471,1.302
DestroyOnly/twitter,ns,416055,336082,1.238
Diff/canada,ns,3.98055e+07,3.80466e+06,10.462
Diff/citm_catalog,ns,7.1859e+06,1.12351e+06,6.396
Diff/twitter,ns,5.11261e+06,661062,7.734
Dump/canada / -,ns,6.95189e+06,2.33647e+06,2.975
Dump/canada / 4,ns,9.09882e+06,3.10291e+06,2.932
Dump/citm_catalog / -,ns,1.42117e+06,295678,4.806
Dump/citm_catalog / 4,ns,1.98589e+06,422600,4.699
Dump/floats / -,ns,6.4332e+07,2.37747e+07,2.706
Dump/floats / 4,ns,7.25695e+07,2.46207e+07,2.947
Dump/jeopardy / -,ns,2.06771e+08,3.17494e+07,6.513
Dump/jeopardy / 4,ns,2.27967e+08,3.53626e+07,6.447
Dump/signed_ints / -,ns,2.40551e+07,1.0736e+07,2.241
Dump/signed_ints / 4,ns,3.25192e+07,1.1333e+07,2.869
Dump/small_signed_ints / -,ns,1.81398e+07,8.12457e+06,2.233
Dump/small_signed_ints / 4,ns,2.55296e+07,8.80796e+06,2.898
Dump/twitter / -,ns,1.43584e+06,214252,6.702
Dump/twitter / 4,ns,1.63183e+06,253042,6.449
Dump/unsigned_ints / -,ns,2.39512e+07,8.11916e+06,2.950
Dump/unsigned_ints / 4,ns,3.22761e+07,8.58925e+06,3.758
Equal/canada,ns,473767,349284,1.356
Equal/citm_catalog,ns,279548,263329,1.062
Equal/twitter,ns,145555,131450,1.107
Flatten/canada,ns,2.94475e+07,1.11184e+07,2.649
Flatten/citm_catalog,ns,6.7155e+06,3.07325e+06,2.185
Flatten/twitter,ns,3.66077e+06,2.10599e+06,1.738
FlattenOrdered/citm_catalog,ns,2.62026e+08,1.42645e+06,183.691
FlattenOrdered/twitter,ns,5.1275e+07,890275,57.595
FromBinaryBuffer/bjdata / canada,ns,8.81972e+06,4.16727e+06,2.116
FromBinaryBuffer/bjdata / twitter,ns,3.32045e+06,976266,3.401
FromBinaryBuffer/bjdata_optimized / canada,ns,9.2386e+06,2.47996e+06,3.725
FromBinaryBuffer/bjdata_optimized / twitter,ns,3.30526e+06,985625,3.353
FromBinaryBuffer/bson / canada,ns,1.00372e+07,4.31554e+06,2.326
FromBinaryBuffer/bson / citm_catalog,ns,4.07611e+06,1.60647e+06,2.537
FromBinaryBuffer/bson / twitter,ns,3.25635e+06,936933,3.476
FromBinaryBuffer/cbor / canada,ns,8.89562e+06,2.11517e+06,4.206
FromBinaryBuffer/cbor / citm_catalog,ns,3.94234e+06,1.45242e+06,2.714
FromBinaryBuffer/cbor / floats,ns,3.0473e+07,5.47969e+06,5.561
FromBinaryBuffer/cbor / jeopardy,ns,3.73185e+08,1.14934e+08,3.247
FromBinaryBuffer/cbor / signed_ints,ns,3.66673e+07,9.88892e+06,3.708
FromBinaryBuffer/cbor / twitter,ns,3.23196e+06,953415,3.390
FromBinaryBuffer/msgpack / canada,ns,8.85983e+06,2.12215e+06,4.175
FromBinaryBuffer/msgpack / citm_catalog,ns,3.84901e+06,1.4503e+06,2.654
FromBinaryBuffer/msgpack / jeopardy,ns,3.73143e+08,1.11034e+08,3.361
FromBinaryBuffer/msgpack / twitter,ns,3.2397e+06,954811,3.393
FromBinaryBuffer/ubjson / canada,ns,8.84059e+06,4.20402e+06,2.103
FromBinaryBuffer/ubjson / citm_catalog,ns,4.0708e+06,1.78566e+06,2.280
FromBinaryBuffer/ubjson / jeopardy,ns,3.79093e+08,1.17024e+08,3.239
FromBinaryBuffer/ubjson / twitter,ns,3.29948e+06,981057,3.363
FromBinaryBuffer/ubjson_optimized / canada,ns,8.88909e+06,2.42788e+06,3.661
FromBinaryBuffer/ubjson_optimized / twitter,ns,3.29784e+06,974810,3.383
FromBinaryFile/bjdata / twitter,ns,1.09208e+07,1.94678e+06,5.610
FromBinaryFile/bson / twitter,ns,1.07209e+07,1.84971e+06,5.796
FromBinaryFile/cbor / canada,ns,1.49218e+07,4.48832e+06,3.325
FromBinaryFile/cbor / twitter,ns,1.03718e+07,1.57388e+06,6.590
FromBinaryFile/ubjson / canada,ns,1.43414e+07,6.42996e+06,2.230
FromBinaryFile/ubjson / twitter,ns,1.09266e+07,1.97275e+06,5.539
FromBinaryShape/containers / bjdata,ns,1.46977e+07,7.23447e+06,2.032
FromBinaryShape/containers / bson,ns,1.75596e+07,7.88867e+06,2.226
FromBinaryShape/containers / cbor,ns,1.46488e+07,4.15792e+06,3.523
FromBinaryShape/containers / msgpack,ns,1.45853e+07,3.89266e+06,3.747
FromBinaryShape/containers / ubjson,ns,1.49773e+07,7.23987e+06,2.069
FromBinaryShape/containers / ubjson_optimized,ns,1.54989e+07,4.55976e+06,3.399
FromBinaryShape/nested / bjdata,ns,96825.9,38335.1,2.526
FromBinaryShape/nested / bson,ns,101356,42620.2,2.378
FromBinaryShape/nested / cbor,ns,94929.8,35845.6,2.648
FromBinaryShape/nested / msgpack,ns,92610.2,35078.3,2.640
FromBinaryShape/nested / ubjson,ns,96090.6,38285.6,2.510
FromBinaryShape/scalars / bjdata,ns,2.52616e+07,1.15856e+07,2.180
FromBinaryShape/scalars / cbor,ns,2.62118e+07,5.88743e+06,4.452
FromBinaryShape/scalars / msgpack,ns,2.50706e+07,5.65159e+06,4.436
FromBinaryShape/scalars / ubjson,ns,2.53402e+07,1.16191e+07,2.181
FromCborChunkedString/10000 chunks,ns,91845.9,82875.5,1.108
FromMsgpack/canada,ns,1.48853e+07,4.56225e+06,3.263
FromMsgpack/citm_catalog,ns,9.3559e+06,2.26246e+06,4.135
FromMsgpack/floats,ns,6.12575e+07,2.86709e+07,2.137
FromMsgpack/jeopardy,ns,1.16767e+09,1.90153e+08,6.141
FromMsgpack/signed_ints,ns,6.38812e+07,3.28867e+07,1.942
FromMsgpack/small_signed_ints,ns,6.44688e+07,3.44227e+07,1.873
FromMsgpack/twitter,ns,1.02787e+07,1.48541e+06,6.920
FromMsgpack/unsigned_ints,ns,5.7784e+07,2.83078e+07,2.041
"GetArray<std::array<int, 1000>>",ns,2274.63,654.431,3.476
GetArray<std::deque<int>>,ns,8288.3,1175.75,7.049
GetArray<std::set<int>>,ns,60017.4,42504.9,1.412
GetArray<std::vector<int>>,ns,6785.73,681.915,9.951
GetMap/citm_catalog,ns,3.60313e+06,2.48546e+06,1.450
GetVectorDouble/floats,ns,6.83612e+06,656162,10.418
GetVectorInt/signed_ints,ns,8.22365e+06,3.46495e+06,2.373
Iterate/canada,ns,897083,328035,2.735
Iterate/citm_catalog,ns,305421,171245,1.784
Iterate/twitter,ns,89996.6,61975.8,1.452
JsonPointerAt/citm_catalog,ns,1.89898e+06,1.17751e+06,1.613
JsonPointerAt/twitter,ns,817946,611519,1.338
JsonPointerContains/citm_catalog,ns,2.8177e+06,1.26796e+06,2.222
JsonPointerContains/twitter,ns,1.33508e+06,628630,2.124
JsonPointerParse/citm_catalog,ns,5.81355e+06,2.24831e+06,2.586
JsonPointerParse/twitter,ns,2.47971e+06,1.02159e+06,2.427
JsonPointerToString/citm_catalog,ns,6.7858e+06,1.93924e+06,3.499
JsonPointerToString/twitter,ns,2.23096e+06,834416,2.674
ParseFILE/canada,ns,5.41907e+07,1.46942e+07,3.688
ParseFILE/citm_catalog,ns,3.59542e+07,7.58092e+06,4.743
ParseFILE/twitter,ns,1.4087e+07,3.44991e+06,4.083
ParseFile/canada,ns,1.82792e+07,6.46954e+06,2.825
ParseFile/citm_catalog,ns,8.12979e+06,2.52336e+06,3.222
ParseFile/floats,ns,1.31229e+08,4.81407e+07,2.726
ParseFile/jeopardy,ns,3.38017e+08,1.62098e+08,2.085
ParseFile/signed_ints,ns,1.28749e+08,4.62304e+07,2.785
ParseFile/small_signed_ints,ns,6.47398e+07,3.34103e+07,1.938
ParseFile/twitter,ns,3.43041e+06,1.37495e+06,2.495
ParseFile/unsigned_ints,ns,1.24001e+08,4.74365e+07,2.614
ParseIndented/canada / 4,ns,3.4977e+07,5.37149e+06,6.512
ParseIndented/citm_catalog / 4,ns,7.52423e+06,1.81376e+06,4.148
ParseIndented/jeopardy / 4,ns,3.45046e+08,1.33383e+08,2.587
ParseIndented/twitter / 4,ns,3.72283e+06,1.12645e+06,3.305
ParseStreamValues/ndjson,ns,7.15876e+06,3.76965e+06,1.899
ParseStreamValues/numbers,ns,1.92619e+06,383138,5.027
ParseString/canada,ns,1.55213e+07,4.62776e+06,3.354
ParseString/citm_catalog,ns,7.56417e+06,1.77967e+06,4.250
ParseString/floats,ns,1.21779e+08,2.83035e+07,4.303
ParseString/jeopardy,ns,3.16817e+08,1.30897e+08,2.420
ParseString/signed_ints,ns,1.22931e+08,3.19852e+07,3.843
ParseString/small_signed_ints,ns,6.2685e+07,2.49764e+07,2.510
ParseString/twitter,ns,3.2961e+06,1.04867e+06,3.143
ParseString/unsigned_ints,ns,1.21229e+08,3.29241e+07,3.682
ParseStringOrdered/canada,ns,1.5388e+07,4.5275e+06,3.399
ParseStringOrdered/citm_catalog,ns,1.15204e+07,1.68115e+06,6.853
ParseStringOrdered/jeopardy,ns,3.73533e+08,1.13397e+08,3.294
ParseStringOrdered/twitter,ns,4.5979e+06,948606,4.847
Patch/canada,ns,1.03684e+07,3.47719e+06,2.982
Patch/citm_catalog,ns,2.74522e+06,1.74191e+06,1.576
Patch/twitter,ns,1.57928e+06,888657,1.777
SaxParse/canada,ns,1.31023e+07,3.26697e+06,4.011
SaxParse/citm_catalog,ns,6.54642e+06,966806,6.771
SaxParse/twitter,ns,2.53102e+06,483052,5.240
ToCbor/canada,ns,1.41339e+06,556912,2.538
ToCbor/citm_catalog,ns,1.04743e+06,259178,4.041
ToCbor/floats,ns,9.04677e+06,1.90094e+06,4.759
ToCbor/jeopardy,ns,7.39339e+07,2.20678e+07,3.350
ToCbor/signed_ints,ns,1.15333e+07,2.827e+06,4.080
ToCbor/small_signed_ints,ns,1.0394e+07,2.47974e+06,4.192
ToCbor/twitter,ns,658566,143397,4.593
ToCbor/unsigned_ints,ns,8.17966e+06,2.81588e+06,2.905
ToJsonStrings/copy,ns,6.12e+06,5.65303e+06,1.083
ToJsonStrings/move,ns,6.13061e+06,3.13303e+06,1.957
Unflatten/canada,ns,4.25276e+07,1.10995e+07,3.831
Unflatten/citm_catalog,ns,1.01866e+07,3.62185e+06,2.813
Unflatten/twitter,ns,4.74536e+06,2.21103e+06,2.146
1 benchmark unit 3.12.0 3.13.0 speedup
2 Accept/canada ns 1.29488e+07 2.3494e+06 5.512
3 Accept/citm_catalog ns 6.53091e+06 923408 7.073
4 Accept/floats ns 1.15702e+08 2.26771e+07 5.102
5 Accept/jeopardy ns 2.20758e+08 5.92935e+07 3.723
6 Accept/signed_ints ns 1.17358e+08 2.82947e+07 4.148
7 Accept/small_signed_ints ns 5.75113e+07 1.80352e+07 3.189
8 Accept/twitter ns 2.51345e+06 483792 5.195
9 Accept/unsigned_ints ns 1.16297e+08 2.97181e+07 3.913
10 BinaryToCbor/1024 ns 298.444 107.095 2.787
11 BinaryToCbor/128 ns 248.661 116.711 2.131
12 BinaryToCbor/16 ns 244.687 49.6325 4.930
13 BinaryToCbor/16384 ns 952.115 413.62 2.302
14 BinaryToCbor/2048 ns 328.419 125.183 2.624
15 BinaryToCbor/256 ns 264.678 90.8937 2.912
16 BinaryToCbor/32 ns 251.632 50.4059 4.992
17 BinaryToCbor/32768 ns 1541.05 802.721 1.920
18 BinaryToCbor/4096 ns 406.957 177.412 2.294
19 BinaryToCbor/512 ns 289.876 102.063 2.840
20 BinaryToCbor/64 ns 254.928 84.6434 3.012
21 BinaryToCbor/8 ns 247.618 49.3761 5.015
22 BinaryToCbor/8192 ns 514.281 256.456 2.005
23 Copy/canada ns 3.78116e+06 2.92734e+06 1.292
24 Copy/citm_catalog ns 1.7026e+06 1.51108e+06 1.127
25 Copy/twitter ns 840201 767400 1.095
26 CopyAssign/canada ns 3.86416e+06 2.94449e+06 1.312
27 CopyAssign/citm_catalog ns 1.76529e+06 1.58608e+06 1.113
28 CopyAssign/twitter ns 884985 790724 1.119
29 CopyOnly/canada ns 1.60229e+06 1.57507e+06 1.017
30 CopyOnly/citm_catalog ns 786244 817481 0.962
31 CopyOnly/twitter ns 423631 420649 1.007
32 CopyRing/canada ns 3.86433e+06 2.99657e+06 1.290
33 CopyRing/citm_catalog ns 1.84434e+06 1.60579e+06 1.149
34 CopyRing/twitter ns 951510 818035 1.163
35 DestroyOnly/canada ns 2.22138e+06 1.40157e+06 1.585
36 DestroyOnly/citm_catalog ns 926244 711471 1.302
37 DestroyOnly/twitter ns 416055 336082 1.238
38 Diff/canada ns 3.98055e+07 3.80466e+06 10.462
39 Diff/citm_catalog ns 7.1859e+06 1.12351e+06 6.396
40 Diff/twitter ns 5.11261e+06 661062 7.734
41 Dump/canada / - ns 6.95189e+06 2.33647e+06 2.975
42 Dump/canada / 4 ns 9.09882e+06 3.10291e+06 2.932
43 Dump/citm_catalog / - ns 1.42117e+06 295678 4.806
44 Dump/citm_catalog / 4 ns 1.98589e+06 422600 4.699
45 Dump/floats / - ns 6.4332e+07 2.37747e+07 2.706
46 Dump/floats / 4 ns 7.25695e+07 2.46207e+07 2.947
47 Dump/jeopardy / - ns 2.06771e+08 3.17494e+07 6.513
48 Dump/jeopardy / 4 ns 2.27967e+08 3.53626e+07 6.447
49 Dump/signed_ints / - ns 2.40551e+07 1.0736e+07 2.241
50 Dump/signed_ints / 4 ns 3.25192e+07 1.1333e+07 2.869
51 Dump/small_signed_ints / - ns 1.81398e+07 8.12457e+06 2.233
52 Dump/small_signed_ints / 4 ns 2.55296e+07 8.80796e+06 2.898
53 Dump/twitter / - ns 1.43584e+06 214252 6.702
54 Dump/twitter / 4 ns 1.63183e+06 253042 6.449
55 Dump/unsigned_ints / - ns 2.39512e+07 8.11916e+06 2.950
56 Dump/unsigned_ints / 4 ns 3.22761e+07 8.58925e+06 3.758
57 Equal/canada ns 473767 349284 1.356
58 Equal/citm_catalog ns 279548 263329 1.062
59 Equal/twitter ns 145555 131450 1.107
60 Flatten/canada ns 2.94475e+07 1.11184e+07 2.649
61 Flatten/citm_catalog ns 6.7155e+06 3.07325e+06 2.185
62 Flatten/twitter ns 3.66077e+06 2.10599e+06 1.738
63 FlattenOrdered/citm_catalog ns 2.62026e+08 1.42645e+06 183.691
64 FlattenOrdered/twitter ns 5.1275e+07 890275 57.595
65 FromBinaryBuffer/bjdata / canada ns 8.81972e+06 4.16727e+06 2.116
66 FromBinaryBuffer/bjdata / twitter ns 3.32045e+06 976266 3.401
67 FromBinaryBuffer/bjdata_optimized / canada ns 9.2386e+06 2.47996e+06 3.725
68 FromBinaryBuffer/bjdata_optimized / twitter ns 3.30526e+06 985625 3.353
69 FromBinaryBuffer/bson / canada ns 1.00372e+07 4.31554e+06 2.326
70 FromBinaryBuffer/bson / citm_catalog ns 4.07611e+06 1.60647e+06 2.537
71 FromBinaryBuffer/bson / twitter ns 3.25635e+06 936933 3.476
72 FromBinaryBuffer/cbor / canada ns 8.89562e+06 2.11517e+06 4.206
73 FromBinaryBuffer/cbor / citm_catalog ns 3.94234e+06 1.45242e+06 2.714
74 FromBinaryBuffer/cbor / floats ns 3.0473e+07 5.47969e+06 5.561
75 FromBinaryBuffer/cbor / jeopardy ns 3.73185e+08 1.14934e+08 3.247
76 FromBinaryBuffer/cbor / signed_ints ns 3.66673e+07 9.88892e+06 3.708
77 FromBinaryBuffer/cbor / twitter ns 3.23196e+06 953415 3.390
78 FromBinaryBuffer/msgpack / canada ns 8.85983e+06 2.12215e+06 4.175
79 FromBinaryBuffer/msgpack / citm_catalog ns 3.84901e+06 1.4503e+06 2.654
80 FromBinaryBuffer/msgpack / jeopardy ns 3.73143e+08 1.11034e+08 3.361
81 FromBinaryBuffer/msgpack / twitter ns 3.2397e+06 954811 3.393
82 FromBinaryBuffer/ubjson / canada ns 8.84059e+06 4.20402e+06 2.103
83 FromBinaryBuffer/ubjson / citm_catalog ns 4.0708e+06 1.78566e+06 2.280
84 FromBinaryBuffer/ubjson / jeopardy ns 3.79093e+08 1.17024e+08 3.239
85 FromBinaryBuffer/ubjson / twitter ns 3.29948e+06 981057 3.363
86 FromBinaryBuffer/ubjson_optimized / canada ns 8.88909e+06 2.42788e+06 3.661
87 FromBinaryBuffer/ubjson_optimized / twitter ns 3.29784e+06 974810 3.383
88 FromBinaryFile/bjdata / twitter ns 1.09208e+07 1.94678e+06 5.610
89 FromBinaryFile/bson / twitter ns 1.07209e+07 1.84971e+06 5.796
90 FromBinaryFile/cbor / canada ns 1.49218e+07 4.48832e+06 3.325
91 FromBinaryFile/cbor / twitter ns 1.03718e+07 1.57388e+06 6.590
92 FromBinaryFile/ubjson / canada ns 1.43414e+07 6.42996e+06 2.230
93 FromBinaryFile/ubjson / twitter ns 1.09266e+07 1.97275e+06 5.539
94 FromBinaryShape/containers / bjdata ns 1.46977e+07 7.23447e+06 2.032
95 FromBinaryShape/containers / bson ns 1.75596e+07 7.88867e+06 2.226
96 FromBinaryShape/containers / cbor ns 1.46488e+07 4.15792e+06 3.523
97 FromBinaryShape/containers / msgpack ns 1.45853e+07 3.89266e+06 3.747
98 FromBinaryShape/containers / ubjson ns 1.49773e+07 7.23987e+06 2.069
99 FromBinaryShape/containers / ubjson_optimized ns 1.54989e+07 4.55976e+06 3.399
100 FromBinaryShape/nested / bjdata ns 96825.9 38335.1 2.526
101 FromBinaryShape/nested / bson ns 101356 42620.2 2.378
102 FromBinaryShape/nested / cbor ns 94929.8 35845.6 2.648
103 FromBinaryShape/nested / msgpack ns 92610.2 35078.3 2.640
104 FromBinaryShape/nested / ubjson ns 96090.6 38285.6 2.510
105 FromBinaryShape/scalars / bjdata ns 2.52616e+07 1.15856e+07 2.180
106 FromBinaryShape/scalars / cbor ns 2.62118e+07 5.88743e+06 4.452
107 FromBinaryShape/scalars / msgpack ns 2.50706e+07 5.65159e+06 4.436
108 FromBinaryShape/scalars / ubjson ns 2.53402e+07 1.16191e+07 2.181
109 FromCborChunkedString/10000 chunks ns 91845.9 82875.5 1.108
110 FromMsgpack/canada ns 1.48853e+07 4.56225e+06 3.263
111 FromMsgpack/citm_catalog ns 9.3559e+06 2.26246e+06 4.135
112 FromMsgpack/floats ns 6.12575e+07 2.86709e+07 2.137
113 FromMsgpack/jeopardy ns 1.16767e+09 1.90153e+08 6.141
114 FromMsgpack/signed_ints ns 6.38812e+07 3.28867e+07 1.942
115 FromMsgpack/small_signed_ints ns 6.44688e+07 3.44227e+07 1.873
116 FromMsgpack/twitter ns 1.02787e+07 1.48541e+06 6.920
117 FromMsgpack/unsigned_ints ns 5.7784e+07 2.83078e+07 2.041
118 GetArray<std::array<int, 1000>> ns 2274.63 654.431 3.476
119 GetArray<std::deque<int>> ns 8288.3 1175.75 7.049
120 GetArray<std::set<int>> ns 60017.4 42504.9 1.412
121 GetArray<std::vector<int>> ns 6785.73 681.915 9.951
122 GetMap/citm_catalog ns 3.60313e+06 2.48546e+06 1.450
123 GetVectorDouble/floats ns 6.83612e+06 656162 10.418
124 GetVectorInt/signed_ints ns 8.22365e+06 3.46495e+06 2.373
125 Iterate/canada ns 897083 328035 2.735
126 Iterate/citm_catalog ns 305421 171245 1.784
127 Iterate/twitter ns 89996.6 61975.8 1.452
128 JsonPointerAt/citm_catalog ns 1.89898e+06 1.17751e+06 1.613
129 JsonPointerAt/twitter ns 817946 611519 1.338
130 JsonPointerContains/citm_catalog ns 2.8177e+06 1.26796e+06 2.222
131 JsonPointerContains/twitter ns 1.33508e+06 628630 2.124
132 JsonPointerParse/citm_catalog ns 5.81355e+06 2.24831e+06 2.586
133 JsonPointerParse/twitter ns 2.47971e+06 1.02159e+06 2.427
134 JsonPointerToString/citm_catalog ns 6.7858e+06 1.93924e+06 3.499
135 JsonPointerToString/twitter ns 2.23096e+06 834416 2.674
136 ParseFILE/canada ns 5.41907e+07 1.46942e+07 3.688
137 ParseFILE/citm_catalog ns 3.59542e+07 7.58092e+06 4.743
138 ParseFILE/twitter ns 1.4087e+07 3.44991e+06 4.083
139 ParseFile/canada ns 1.82792e+07 6.46954e+06 2.825
140 ParseFile/citm_catalog ns 8.12979e+06 2.52336e+06 3.222
141 ParseFile/floats ns 1.31229e+08 4.81407e+07 2.726
142 ParseFile/jeopardy ns 3.38017e+08 1.62098e+08 2.085
143 ParseFile/signed_ints ns 1.28749e+08 4.62304e+07 2.785
144 ParseFile/small_signed_ints ns 6.47398e+07 3.34103e+07 1.938
145 ParseFile/twitter ns 3.43041e+06 1.37495e+06 2.495
146 ParseFile/unsigned_ints ns 1.24001e+08 4.74365e+07 2.614
147 ParseIndented/canada / 4 ns 3.4977e+07 5.37149e+06 6.512
148 ParseIndented/citm_catalog / 4 ns 7.52423e+06 1.81376e+06 4.148
149 ParseIndented/jeopardy / 4 ns 3.45046e+08 1.33383e+08 2.587
150 ParseIndented/twitter / 4 ns 3.72283e+06 1.12645e+06 3.305
151 ParseStreamValues/ndjson ns 7.15876e+06 3.76965e+06 1.899
152 ParseStreamValues/numbers ns 1.92619e+06 383138 5.027
153 ParseString/canada ns 1.55213e+07 4.62776e+06 3.354
154 ParseString/citm_catalog ns 7.56417e+06 1.77967e+06 4.250
155 ParseString/floats ns 1.21779e+08 2.83035e+07 4.303
156 ParseString/jeopardy ns 3.16817e+08 1.30897e+08 2.420
157 ParseString/signed_ints ns 1.22931e+08 3.19852e+07 3.843
158 ParseString/small_signed_ints ns 6.2685e+07 2.49764e+07 2.510
159 ParseString/twitter ns 3.2961e+06 1.04867e+06 3.143
160 ParseString/unsigned_ints ns 1.21229e+08 3.29241e+07 3.682
161 ParseStringOrdered/canada ns 1.5388e+07 4.5275e+06 3.399
162 ParseStringOrdered/citm_catalog ns 1.15204e+07 1.68115e+06 6.853
163 ParseStringOrdered/jeopardy ns 3.73533e+08 1.13397e+08 3.294
164 ParseStringOrdered/twitter ns 4.5979e+06 948606 4.847
165 Patch/canada ns 1.03684e+07 3.47719e+06 2.982
166 Patch/citm_catalog ns 2.74522e+06 1.74191e+06 1.576
167 Patch/twitter ns 1.57928e+06 888657 1.777
168 SaxParse/canada ns 1.31023e+07 3.26697e+06 4.011
169 SaxParse/citm_catalog ns 6.54642e+06 966806 6.771
170 SaxParse/twitter ns 2.53102e+06 483052 5.240
171 ToCbor/canada ns 1.41339e+06 556912 2.538
172 ToCbor/citm_catalog ns 1.04743e+06 259178 4.041
173 ToCbor/floats ns 9.04677e+06 1.90094e+06 4.759
174 ToCbor/jeopardy ns 7.39339e+07 2.20678e+07 3.350
175 ToCbor/signed_ints ns 1.15333e+07 2.827e+06 4.080
176 ToCbor/small_signed_ints ns 1.0394e+07 2.47974e+06 4.192
177 ToCbor/twitter ns 658566 143397 4.593
178 ToCbor/unsigned_ints ns 8.17966e+06 2.81588e+06 2.905
179 ToJsonStrings/copy ns 6.12e+06 5.65303e+06 1.083
180 ToJsonStrings/move ns 6.13061e+06 3.13303e+06 1.957
181 Unflatten/canada ns 4.25276e+07 1.10995e+07 3.831
182 Unflatten/citm_catalog ns 1.01866e+07 3.62185e+06 2.813
183 Unflatten/twitter ns 4.74536e+06 2.21103e+06 2.146