diff --git a/docs/mkdocs/docs/home/blog/how_3_13_0_got_faster.md b/docs/mkdocs/docs/home/blog/how_3_13_0_got_faster.md index 7833ec30c..319bfe541 100644 --- a/docs/mkdocs/docs/home/blog/how_3_13_0_got_faster.md +++ b/docs/mkdocs/docs/home/blog/how_3_13_0_got_faster.md @@ -391,10 +391,14 @@ vst1q_u8(d + n - 16, b); // the two stores overlap too, with the same bytes

Writing a string of 16 to 32 bytes with two overlapping loads and stores (NEON).

-Both loads lie inside the string, together they cover all of it, and all tests happen before the first store. Shorter -strings use the same trick with two overlapping 8-, 4- or 2-byte loads, so no `memcpy` with a length known only at run -time is left. On `twitter.json`, -this cut the instructions of `dump()` by 21 %. +
+--8<-- "images/perf_blog_overlap.svg" +
+ +

The code above on `profile_link_color`, a key of `twitter.json`.

+ +Shorter strings use the same trick with two overlapping 8-, 4- or 2-byte loads, so no `memcpy` with a length known +only at run time is left. On `twitter.json`, this cut the instructions of `dump()` by 21 %. ### Escapes from a table @@ -476,11 +480,14 @@ std::uint32_t parse_eight_digits(std::uint64_t v) noexcept

fast_float's conversion of eight ASCII digits to their value, with three multiplications.

-The mask turns the characters into digit values. Multiplying by `10·2⁸ + 1` adds ten times each byte to the byte -above it, so after the shift every second byte holds a two-digit number: `"12345678"` becomes 12, 34, 56 and 78. The -second step does the same with pairs of bytes and a factor of 100 (1234 and 5678), the third with 32-bit halves and -10,000. Whether all eight bytes are digits is one more expression: a digit is 0x30 to 0x39, so its high nibble must be -3, and adding 6 must keep it 3. Integers of up to 18 digits and floats of up to 19 then need no overflow check at all. +
+--8<-- "images/perf_blog_digits.svg" +
+ +

`parse_eight_digits()` on `"12345678"`: multiplying by `10·2⁸ + 1` adds ten times each byte to the byte above it, and the shift and the next mask keep every second lane.

+ +Whether all eight bytes are digits is one more expression: a digit is 0x30 to 0x39, so its high nibble must be 3, and +adding 6 must keep it 3. Integers of up to 18 digits and floats of up to 19 then need no overflow check at all. ### Clinger's fast path @@ -1290,9 +1297,17 @@ The four files are the ones 3.13.0 was tuned on, so we also ran *validate*, *sum other files of simdjson's [`jsonexamples`](https://github.com/simdjson/simdjson-data/tree/master/jsonexamples). By geometric mean, `json_document` stays the fastest in *validate*, *minify* and *write* on every compiler, and in *sum* with Clang and on the Mac; with GCC, simdjson sums in 0.83 to 0.85 of its time. File by file, it is less -clear-cut: on x86-64, `json_document` validates only 4 to 8 of the 19 files fastest (13 on the Mac). simdjson wins 5 -to 8 of the others, and Boost.JSON, without number conversion, validates the number-heavy `mesh.pretty`, `numbers` -and `marine_ik` up to 1.5 times as fast. We know two causes, but so far each fix slowed down other files. +clear-cut: + +
+--8<-- "images/perf_blog_heldout.svg" +
+ +

*validate* on the 19 files: `json_document`'s fastest fully validating way against the fastest library's, per file; 1.0× means it is the fastest. Less is better. The right column names the fastest library on x86-64 (GCC 16.2).

+ +On x86-64, `json_document` validates only 4 to 8 of the 19 files fastest, against 13 on the Mac. Boost.JSON, without +number conversion, validates the number-heavy `mesh.pretty`, `numbers` and `marine_ik` up to 1.5 times as fast. We +know two causes, but so far each fix slowed down other files. Every *validate* way also ran the 318 files of [JSONTestSuite](https://github.com/nst/JSONTestSuite). The fully validating ways pass, with a few exceptions listed in [Appendix E](#e-comparison-with-other-libraries), one of them diff --git a/docs/mkdocs/docs/images/perf_blog_digits.svg b/docs/mkdocs/docs/images/perf_blog_digits.svg new file mode 100644 index 000000000..3321875da --- /dev/null +++ b/docs/mkdocs/docs/images/perf_blog_digits.svg @@ -0,0 +1,66 @@ + +Converting eight A​SCII digits to their value with three multiplications +The text 12345678 as one word. Masking gives the digit values 1 to 8, one per byte. Multiplying by 10 times 2 to the 8 plus 1 and shifting gives 12, 34, 56 and 78 in 16-bit lanes; multiplying by 100 times 2 to the 16 plus 1 gives 1234 and 5678 in 32-bit lanes; multiplying by 10000 times 2 to the 32 plus 1 gives 12345678. +eight A​SCII digits in one 64-bit word (byte 0 is the lowest) + +1 +0x31 + +2 +0x32 + +3 +0x33 + +4 +0x34 + +5 +0x35 + +6 +0x36 + +7 +0x37 + +8 +0x38 +& 0x0F0F0F0F0F0F0F0F: one digit value per byte + +1 + +2 + +3 + +4 + +5 + +6 + +7 + +8 +× (10 · 2⁸ + 1) >> 8, every second byte kept: two digits per 16 bits + +12 + +34 + +56 + +78 +× (100 · 2¹⁶ + 1) >> 16, every second lane kept: four digits per 32 bits + +1234 + +5678 +× (10000 · 2³² + 1) >> 32: the value + + +12345678 +Each step combines neighboring lanes, in all lanes of the word at once: +three multiplications instead of eight, and no branch. + diff --git a/docs/mkdocs/docs/images/perf_blog_heldout.svg b/docs/mkdocs/docs/images/perf_blog_heldout.svg new file mode 100644 index 000000000..26c9ef4e9 --- /dev/null +++ b/docs/mkdocs/docs/images/perf_blog_heldout.svg @@ -0,0 +1,98 @@ + +Validating 19 files 3.13.0 was not tuned on: json_document's time relative to the fastest library per file +Dot plot per file, less is better; 1.0 means json_document is the fastest fully validating library. github_events: Mac 1.00, x86-64 1.00 (nlohmann/json json_document); mesh: Mac 1.00, x86-64 1.00 (nlohmann/json json_document); semanticscholar-corpus: Mac 1.00, x86-64 1.00 (nlohmann/json json_document); twitter_api_compact_response: Mac 1.00, x86-64 1.00 (nlohmann/json json_document); twitter_api_response: Mac 1.00, x86-64 1.00 (nlohmann/json json_document); update-center: Mac 1.00, x86-64 1.00 (nlohmann/json json_document); apache_builds: Mac 1.15, x86-64 1.00 (nlohmann/json json_document); twitter_timeline: Mac 1.04, x86-64 1.02 (yyjson); twitterescaped: Mac 1.10, x86-64 1.08 (simdjson); gsoc-2018: Mac 1.00, x86-64 1.10 (Boost.J​SON); google_maps_api_compact_response: Mac 1.03, x86-64 1.12 (yyjson); tree-pretty: Mac 1.01, x86-64 1.14 (simdjson); repeat: Mac 1.00, x86-64 1.14 (simdjson); random: Mac 1.00, x86-64 1.17 (simdjson); instruments: Mac 1.00, x86-64 1.18 (simdjson); google_maps_api_response: Mac 1.01, x86-64 1.19 (simdjson); marine_ik: Mac 1.00, x86-64 1.23 (Boost.J​SON); numbers: Mac 1.00, x86-64 1.32 (Boost.J​SON); mesh.pretty: Mac 1.00, x86-64 1.49 (Boost.J​SON). + +1.0× + +1.1× + +1.2× + +1.3× + +1.4× + +1.5× +json_document’s time / the fastest library’s, less is better +Apple M1 Max +x86-64, G​CC 16.2 +fastest on x86-64 +github_events +github_events, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +github_events, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +mesh +mesh, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +mesh, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +semanticscholar-corpus +semanticscholar-corpus, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +semanticscholar-corpus, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +twitter_api_compact_response +twitter_api_compact_response, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +twitter_api_compact_response, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +twitter_api_response +twitter_api_response, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +twitter_api_response, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +update-center +update-center, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +update-center, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +apache_builds +apache_builds, Apple M1 Max: 1.15× the time of simdjson +apache_builds, x86-64, G​CC 16.2: 1.00× the time of the fastest (it is the fastest) +json_document +twitter_timeline +twitter_timeline, Apple M1 Max: 1.04× the time of yyjson +twitter_timeline, x86-64, G​CC 16.2: 1.02× the time of yyjson +yyjson +twitterescaped +twitterescaped, Apple M1 Max: 1.10× the time of yyjson +twitterescaped, x86-64, G​CC 16.2: 1.08× the time of simdjson +simdjson +gsoc-2018 +gsoc-2018, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +gsoc-2018, x86-64, G​CC 16.2: 1.10× the time of Boost.J​SON +Boost.J​SON +google_maps_api_compact_response +google_maps_api_compact_response, Apple M1 Max: 1.03× the time of yyjson +google_maps_api_compact_response, x86-64, G​CC 16.2: 1.12× the time of yyjson +yyjson +tree-pretty +tree-pretty, Apple M1 Max: 1.01× the time of simdjson +tree-pretty, x86-64, G​CC 16.2: 1.14× the time of simdjson +simdjson +repeat +repeat, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +repeat, x86-64, G​CC 16.2: 1.14× the time of simdjson +simdjson +random +random, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +random, x86-64, G​CC 16.2: 1.17× the time of simdjson +simdjson +instruments +instruments, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +instruments, x86-64, G​CC 16.2: 1.18× the time of simdjson +simdjson +google_maps_api_response +google_maps_api_response, Apple M1 Max: 1.01× the time of simdjson +google_maps_api_response, x86-64, G​CC 16.2: 1.19× the time of simdjson +simdjson +marine_ik +marine_ik, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +marine_ik, x86-64, G​CC 16.2: 1.23× the time of Boost.J​SON +Boost.J​SON +numbers +numbers, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +numbers, x86-64, G​CC 16.2: 1.32× the time of Boost.J​SON +Boost.J​SON +mesh.pretty +mesh.pretty, Apple M1 Max: 1.00× the time of the fastest (it is the fastest) +mesh.pretty, x86-64, G​CC 16.2: 1.49× the time of Boost.J​SON +Boost.J​SON + +fastest + diff --git a/docs/mkdocs/docs/images/perf_blog_overlap.svg b/docs/mkdocs/docs/images/perf_blog_overlap.svg new file mode 100644 index 000000000..390603f69 --- /dev/null +++ b/docs/mkdocs/docs/images/perf_blog_overlap.svg @@ -0,0 +1,72 @@ + +Writing an 18-byte string with two overlapping 16-byte loads and stores +The 18 bytes of profile_link_color. Load a covers bytes 0 to 15, load b covers bytes 2 to 17, so bytes 2 to 15 are in both. Neither contains a byte that needs escaping, so a is stored at the destination and b 2 bytes later; the second store writes bytes 2 to 15 again with the same values. This works for any length from 16 to 32 bytes without a loop. +a string of n = 18 bytes: too long for one 16-byte vector, too short for a loop + +p + +r + + +o + + +f + + +i + + +l + + +e + + +_ + + +l + + +i + + +n + + +k + + +_ + + +c + + +o + + +l + +o + +r +0 +2 +15 +17 + + + +a = load 16 bytes at p + + + +b = load 16 bytes at p + n − 16 +Both loads lie inside the string, and together they cover all of it; bytes 2 to 15 are in both. +Test a and b for a quote, a backslash, a control character or 0x7F: none, so write +store a at d, store b at d + n − 16 +The second store writes bytes 2 to 15 again, with the same values. For any n from 16 to 32: +two loads, one test, two stores, no loop and no branch on the length. + diff --git a/docs/mkdocs/scripts/figures/data/perf_heldout_validate.json b/docs/mkdocs/scripts/figures/data/perf_heldout_validate.json new file mode 100644 index 000000000..faa28bef9 --- /dev/null +++ b/docs/mkdocs/scripts/figures/data/perf_heldout_validate.json @@ -0,0 +1,3202 @@ +{ + "mac": { + "apache_builds": { + "Boost.JSON": { + "us": 109.8, + "variant": "SAX" + }, + "Glaze": { + "us": 86.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 270.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 120.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 40.2, + "variant": "parse" + }, + "serde_json": { + "us": 87.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 55.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 34.9, + "variant": "DOM" + }, + "sonic-rs": { + "us": 63.2, + "variant": "Value" + }, + "yyjson": { + "us": 54.5, + "variant": "insitu (copy)" + } + }, + "github_events": { + "Boost.JSON": { + "us": 56.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 35.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 144.9, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 46.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 14.5, + "variant": "parse" + }, + "serde_json": { + "us": 35.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 27.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 17.9, + "variant": "DOM" + }, + "sonic-rs": { + "us": 24.5, + "variant": "Value" + }, + "yyjson": { + "us": 19.1, + "variant": "insitu (copy)" + } + }, + "google_maps_api_compact_response": { + "Boost.JSON": { + "us": 11.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 12.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 29.2, + "variant": "SAX" + }, + "nlohmann json": { + "us": 19.2, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 6.5, + "variant": "parse" + }, + "serde_json": { + "us": 14.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 10.5, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 7.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 8.7, + "variant": "Value" + }, + "yyjson": { + "us": 6.3, + "variant": "insitu (copy)" + } + }, + "google_maps_api_response": { + "Boost.JSON": { + "us": 19.2, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 17.7, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 39.0, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 25.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 9.5, + "variant": "accept" + }, + "serde_json": { + "us": 20.7, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 13.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 9.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 14.7, + "variant": "Value" + }, + "yyjson": { + "us": 9.4, + "variant": "insitu (copy)" + } + }, + "gsoc-2018": { + "Boost.JSON": { + "us": 2783.4, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 1059.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 7219.2, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1131.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 560.1, + "variant": "parse" + }, + "serde_json": { + "us": 1034.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 1246.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 837.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 758.0, + "variant": "Value" + }, + "yyjson": { + "us": 936.1, + "variant": "insitu (copy)" + } + }, + "instruments": { + "Boost.JSON": { + "us": 159.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 136.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 381.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 199.7, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 76.5, + "variant": "parse" + }, + "serde_json": { + "us": 160.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 110.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 80.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 125.2, + "variant": "Value" + }, + "yyjson": { + "us": 78.0, + "variant": "insitu (copy)" + } + }, + "marine_ik": { + "Boost.JSON": { + "us": 2485.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 2297.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 5056.8, + "variant": "SAX" + }, + "nlohmann json": { + "us": 4217.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1697.0, + "variant": "parse" + }, + "serde_json": { + "us": 2841.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 3150.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 2454.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 2910.2, + "variant": "Value" + }, + "yyjson": { + "us": 2351.2, + "variant": "insitu (copy)" + } + }, + "mesh": { + "Boost.JSON": { + "us": 588.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 518.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1562.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 956.5, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 414.8, + "variant": "parse" + }, + "serde_json": { + "us": 607.3, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 729.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 627.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 768.4, + "variant": "Value" + }, + "yyjson": { + "us": 565.5, + "variant": "insitu (copy)" + } + }, + "mesh.pretty": { + "Boost.JSON": { + "us": 954.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 835.3, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 2541.6, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1184.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 795.0, + "variant": "parse" + }, + "serde_json": { + "us": 1129.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 1083.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 850.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1160.6, + "variant": "Value" + }, + "yyjson": { + "us": 955.9, + "variant": "read" + } + }, + "numbers": { + "Boost.JSON": { + "us": 89.9, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 89.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 327.3, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 142.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 62.8, + "variant": "parse" + }, + "serde_json": { + "us": 101.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 129.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 118.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 135.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 103.0, + "variant": "insitu (copy)" + } + }, + "random": { + "Boost.JSON": { + "us": 601.5, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 446.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1224.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 783.5, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 234.5, + "variant": "accept" + }, + "serde_json": { + "us": 619.9, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 335.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 251.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 265.5, + "variant": "Value" + }, + "yyjson": { + "us": 315.4, + "variant": "insitu (copy)" + } + }, + "repeat": { + "Boost.JSON": { + "us": 10.7, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 7.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 15.2, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 9.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3.0, + "variant": "accept" + }, + "serde_json": { + "us": 9.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 5.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 4.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 5.6, + "variant": "Value" + }, + "yyjson": { + "us": 4.4, + "variant": "insitu (copy)" + } + }, + "semanticscholar-corpus": { + "Boost.JSON": { + "us": 8277.2, + "variant": "SAX" + }, + "Glaze": { + "us": 4637.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 20811.4, + "variant": "SAX" + }, + "nlohmann json": { + "us": 5973.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 2390.5, + "variant": "accept" + }, + "serde_json": { + "us": 4768.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 4728.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 3401.2, + "variant": "DOM" + }, + "sonic-rs": { + "us": 2766.9, + "variant": "Value" + }, + "yyjson": { + "us": 3598.1, + "variant": "read" + } + }, + "tree-pretty": { + "Boost.JSON": { + "us": 24.5, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 22.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 58.0, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 31.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 11.4, + "variant": "accept" + }, + "serde_json": { + "us": 26.3, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 17.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 11.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 17.1, + "variant": "Value" + }, + "yyjson": { + "us": 11.4, + "variant": "insitu (copy)" + } + }, + "twitter_api_compact_response": { + "Boost.JSON": { + "us": 9.2, + "variant": "SAX" + }, + "Glaze": { + "us": 5.7, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 25.1, + "variant": "SAX" + }, + "nlohmann json": { + "us": 9.2, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3.3, + "variant": "accept" + }, + "serde_json": { + "us": 6.7, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 5.3, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 3.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 4.7, + "variant": "Value" + }, + "yyjson": { + "us": 3.3, + "variant": "insitu (copy)" + } + }, + "twitter_api_response": { + "Boost.JSON": { + "us": 11.9, + "variant": "SAX" + }, + "Glaze": { + "us": 7.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 31.8, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 11.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 4.3, + "variant": "accept" + }, + "serde_json": { + "us": 9.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 6.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 4.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.7, + "variant": "Value" + }, + "yyjson": { + "us": 4.3, + "variant": "insitu (copy)" + } + }, + "twitter_timeline": { + "Boost.JSON": { + "us": 40.4, + "variant": "SAX" + }, + "Glaze": { + "us": 29.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 103.8, + "variant": "SAX" + }, + "nlohmann json": { + "us": 49.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 16.3, + "variant": "parse" + }, + "serde_json": { + "us": 33.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 29.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 17.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 26.4, + "variant": "Value" + }, + "yyjson": { + "us": 15.7, + "variant": "insitu (copy)" + } + }, + "twitterescaped": { + "Boost.JSON": { + "us": 559.8, + "variant": "SAX" + }, + "Glaze": { + "us": 477.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1215.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 813.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 239.1, + "variant": "parse" + }, + "serde_json": { + "us": 397.9, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 537.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 251.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 313.3, + "variant": "Value" + }, + "yyjson": { + "us": 217.2, + "variant": "insitu (copy)" + } + }, + "update-center": { + "Boost.JSON": { + "us": 551.3, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 422.9, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1343.2, + "variant": "SAX" + }, + "nlohmann json": { + "us": 566.1, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 209.7, + "variant": "parse" + }, + "serde_json": { + "us": 406.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 313.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 223.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 221.2, + "variant": "Value" + }, + "yyjson": { + "us": 243.5, + "variant": "read (raw numbers)" + } + } + }, + "x86-clang": { + "apache_builds": { + "Boost.JSON": { + "us": 103.6, + "variant": "SAX" + }, + "Glaze": { + "us": 145.7, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 370.0, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 148.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 61.0, + "variant": "parse" + }, + "serde_json": { + "us": 109.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 126.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 63.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 90.7, + "variant": "Value" + }, + "yyjson": { + "us": 86.3, + "variant": "insitu (copy)" + } + }, + "github_events": { + "Boost.JSON": { + "us": 38.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 65.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 183.3, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 66.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 25.7, + "variant": "accept" + }, + "serde_json": { + "us": 51.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 53.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 29.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 41.1, + "variant": "Value" + }, + "yyjson": { + "us": 33.8, + "variant": "read" + } + }, + "google_maps_api_compact_response": { + "Boost.JSON": { + "us": 14.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 19.9, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 46.1, + "variant": "SAX" + }, + "nlohmann json": { + "us": 31.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 12.3, + "variant": "accept" + }, + "serde_json": { + "us": 16.7, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 23.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 13.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 13.8, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 10.7, + "variant": "insitu (copy)" + } + }, + "google_maps_api_response": { + "Boost.JSON": { + "us": 26.7, + "variant": "SAX" + }, + "Glaze": { + "us": 28.2, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 55.8, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 37.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 17.1, + "variant": "accept" + }, + "serde_json": { + "us": 26.4, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 27.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 14.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 23.3, + "variant": "Value" + }, + "yyjson": { + "us": 17.2, + "variant": "insitu (copy)" + } + }, + "gsoc-2018": { + "Boost.JSON": { + "us": 1005.5, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 2049.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 8350.9, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1608.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1136.3, + "variant": "accept" + }, + "serde_json": { + "us": 1464.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 2005.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1130.8, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1114.9, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1844.4, + "variant": "insitu (copy)" + } + }, + "instruments": { + "Boost.JSON": { + "us": 217.9, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 217.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 543.1, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 303.1, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 148.6, + "variant": "parse" + }, + "serde_json": { + "us": 206.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 256.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 128.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 225.3, + "variant": "Value" + }, + "yyjson": { + "us": 153.6, + "variant": "read" + } + }, + "marine_ik": { + "Boost.JSON": { + "us": 2904.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 3456.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 7659.6, + "variant": "SAX" + }, + "nlohmann json": { + "us": 6841.7, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3523.6, + "variant": "accept" + }, + "serde_json": { + "us": 4143.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 7077.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 4387.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 4871.1, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 3887.4, + "variant": "read" + } + }, + "mesh": { + "Boost.JSON": { + "us": 1017.9, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 713.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 2468.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1744.7, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 839.8, + "variant": "parse" + }, + "serde_json": { + "us": 911.1, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 1679.5, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1167.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1211.3, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1053.5, + "variant": "read" + } + }, + "mesh.pretty": { + "Boost.JSON": { + "us": 1164.1, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 1230.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 4163.2, + "variant": "SAX" + }, + "nlohmann json": { + "us": 2150.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1332.4, + "variant": "parse" + }, + "serde_json": { + "us": 1521.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 2309.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1445.8, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1554.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1625.2, + "variant": "insitu (copy)" + } + }, + "numbers": { + "Boost.JSON": { + "us": 74.7, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 115.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 507.3, + "variant": "SAX" + }, + "nlohmann json": { + "us": 251.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 109.4, + "variant": "parse" + }, + "serde_json": { + "us": 164.3, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 271.6, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 198.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 159.1, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 170.1, + "variant": "read (raw numbers)" + } + }, + "random": { + "Boost.JSON": { + "us": 890.3, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 705.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1782.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1035.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 452.6, + "variant": "parse" + }, + "serde_json": { + "us": 792.9, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 779.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 413.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 506.2, + "variant": "Value" + }, + "yyjson": { + "us": 531.4, + "variant": "insitu (copy)" + } + }, + "repeat": { + "Boost.JSON": { + "us": 13.4, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 11.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 21.2, + "variant": "SAX (raw numbers)" + }, + "nlohmann json": { + "us": 12.6, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 6.0, + "variant": "accept" + }, + "serde_json": { + "us": 12.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 10.6, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 6.2, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.7, + "variant": "Value" + }, + "yyjson": { + "us": 8.8, + "variant": "read" + } + }, + "semanticscholar-corpus": { + "Boost.JSON": { + "us": 5345.8, + "variant": "SAX" + }, + "Glaze": { + "us": 8178.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 27005.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 8693.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3880.7, + "variant": "accept" + }, + "serde_json": { + "us": 6929.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 11228.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 7800.2, + "variant": "DOM" + }, + "sonic-rs": { + "us": 5179.9, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 6290.5, + "variant": "read (raw numbers)" + } + }, + "tree-pretty": { + "Boost.JSON": { + "us": 34.5, + "variant": "SAX" + }, + "Glaze": { + "us": 40.2, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 76.3, + "variant": "SAX" + }, + "nlohmann json": { + "us": 52.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 22.4, + "variant": "accept" + }, + "serde_json": { + "us": 38.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 36.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 19.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 29.7, + "variant": "Value" + }, + "yyjson": { + "us": 19.7, + "variant": "insitu (copy)" + } + }, + "twitter_api_compact_response": { + "Boost.JSON": { + "us": 7.0, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 11.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 35.3, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 15.7, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 5.5, + "variant": "accept" + }, + "serde_json": { + "us": 8.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 12.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 6.2, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.4, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 6.2, + "variant": "read" + } + }, + "twitter_api_response": { + "Boost.JSON": { + "us": 11.5, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 15.7, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 44.8, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 19.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 7.5, + "variant": "parse" + }, + "serde_json": { + "us": 13.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 13.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 7.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 11.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 8.3, + "variant": "insitu (copy)" + } + }, + "twitter_timeline": { + "Boost.JSON": { + "us": 39.4, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 50.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 144.3, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 82.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 27.7, + "variant": "parse" + }, + "serde_json": { + "us": 48.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 52.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 31.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 45.7, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 29.4, + "variant": "read (raw numbers)" + } + }, + "twitterescaped": { + "Boost.JSON": { + "us": 614.9, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 772.3, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1823.1, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1389.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 418.2, + "variant": "parse" + }, + "serde_json": { + "us": 729.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 842.3, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 425.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 654.5, + "variant": "Value" + }, + "yyjson": { + "us": 431.6, + "variant": "read" + } + }, + "update-center": { + "Boost.JSON": { + "us": 342.9, + "variant": "SAX" + }, + "Glaze": { + "us": 711.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1878.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 772.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 312.4, + "variant": "accept" + }, + "serde_json": { + "us": 488.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 643.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 345.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 381.1, + "variant": "Value" + }, + "yyjson": { + "us": 455.4, + "variant": "read" + } + } + }, + "x86-gcc": { + "apache_builds": { + "Boost.JSON": { + "us": 107.7, + "variant": "SAX" + }, + "Glaze": { + "us": 151.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 218.0, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 164.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 59.1, + "variant": "parse" + }, + "serde_json": { + "us": 109.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 126.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 60.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 90.7, + "variant": "Value" + }, + "yyjson": { + "us": 87.5, + "variant": "read" + } + }, + "github_events": { + "Boost.JSON": { + "us": 41.0, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 72.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 114.2, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 70.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 23.8, + "variant": "parse" + }, + "serde_json": { + "us": 51.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 53.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 27.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 41.1, + "variant": "Value" + }, + "yyjson": { + "us": 35.9, + "variant": "insitu (copy)" + } + }, + "google_maps_api_compact_response": { + "Boost.JSON": { + "us": 15.2, + "variant": "SAX" + }, + "Glaze": { + "us": 21.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 29.6, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 32.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 12.2, + "variant": "parse" + }, + "serde_json": { + "us": 16.7, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 23.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 12.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 13.8, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 10.9, + "variant": "insitu (copy)" + } + }, + "google_maps_api_response": { + "Boost.JSON": { + "us": 26.9, + "variant": "SAX" + }, + "Glaze": { + "us": 34.3, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 39.9, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 41.6, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 16.6, + "variant": "accept" + }, + "serde_json": { + "us": 26.4, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 27.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 13.9, + "variant": "DOM" + }, + "sonic-rs": { + "us": 23.3, + "variant": "Value" + }, + "yyjson": { + "us": 17.5, + "variant": "insitu (copy)" + } + }, + "gsoc-2018": { + "Boost.JSON": { + "us": 1053.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 1994.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 4502.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1668.6, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1162.1, + "variant": "parse" + }, + "serde_json": { + "us": 1464.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 2005.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1142.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1114.9, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1849.7, + "variant": "insitu (copy)" + } + }, + "instruments": { + "Boost.JSON": { + "us": 218.6, + "variant": "SAX" + }, + "Glaze": { + "us": 263.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 410.9, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 341.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 140.2, + "variant": "parse" + }, + "serde_json": { + "us": 206.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 256.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 119.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 225.3, + "variant": "Value" + }, + "yyjson": { + "us": 158.4, + "variant": "read" + } + }, + "marine_ik": { + "Boost.JSON": { + "us": 2918.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 4906.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 7333.1, + "variant": "SAX" + }, + "nlohmann json": { + "us": 7464.6, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3598.7, + "variant": "parse" + }, + "serde_json": { + "us": 4143.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 7077.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 4103.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 4871.1, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 3831.6, + "variant": "read (raw numbers)" + } + }, + "mesh": { + "Boost.JSON": { + "us": 978.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 1070.7, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 2362.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1890.5, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 803.5, + "variant": "parse" + }, + "serde_json": { + "us": 911.1, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 1679.5, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1102.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1211.3, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1057.1, + "variant": "read (raw numbers)" + } + }, + "mesh.pretty": { + "Boost.JSON": { + "us": 1048.0, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 1857.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 3817.2, + "variant": "SAX" + }, + "nlohmann json": { + "us": 2603.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1561.0, + "variant": "accept" + }, + "serde_json": { + "us": 1521.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 2309.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1360.8, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1554.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1775.0, + "variant": "read (raw numbers)" + } + }, + "numbers": { + "Boost.JSON": { + "us": 81.5, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 147.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 436.9, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 290.2, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 107.8, + "variant": "parse" + }, + "serde_json": { + "us": 164.3, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 271.6, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 196.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 159.1, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 171.4, + "variant": "read (raw numbers)" + } + }, + "random": { + "Boost.JSON": { + "us": 907.8, + "variant": "SAX" + }, + "Glaze": { + "us": 754.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1111.9, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1157.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 458.0, + "variant": "parse" + }, + "serde_json": { + "us": 792.9, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 779.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 389.8, + "variant": "DOM" + }, + "sonic-rs": { + "us": 506.2, + "variant": "Value" + }, + "yyjson": { + "us": 568.3, + "variant": "insitu (copy)" + } + }, + "repeat": { + "Boost.JSON": { + "us": 14.7, + "variant": "SAX" + }, + "Glaze": { + "us": 15.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 16.6, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 15.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 7.3, + "variant": "parse" + }, + "serde_json": { + "us": 12.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 10.6, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 6.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.7, + "variant": "Value" + }, + "yyjson": { + "us": 9.1, + "variant": "insitu (copy)" + } + }, + "semanticscholar-corpus": { + "Boost.JSON": { + "us": 5729.2, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 8246.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 15070.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 8827.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3869.6, + "variant": "parse" + }, + "serde_json": { + "us": 6929.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 11228.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 7547.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 5179.9, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 6408.0, + "variant": "insitu (copy)" + } + }, + "tree-pretty": { + "Boost.JSON": { + "us": 35.3, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 49.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 73.2, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 53.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 21.6, + "variant": "accept" + }, + "serde_json": { + "us": 38.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 36.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 19.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 29.7, + "variant": "Value" + }, + "yyjson": { + "us": 22.2, + "variant": "read" + } + }, + "twitter_api_compact_response": { + "Boost.JSON": { + "us": 7.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 11.0, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 21.1, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 15.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 5.4, + "variant": "accept" + }, + "serde_json": { + "us": 8.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 12.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 6.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.4, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 6.3, + "variant": "insitu (copy)" + } + }, + "twitter_api_response": { + "Boost.JSON": { + "us": 11.9, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 17.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 30.3, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 20.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 7.4, + "variant": "parse" + }, + "serde_json": { + "us": 13.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 13.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 7.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 11.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 8.5, + "variant": "insitu (copy)" + } + }, + "twitter_timeline": { + "Boost.JSON": { + "us": 45.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 58.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 88.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 81.2, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 28.4, + "variant": "parse" + }, + "serde_json": { + "us": 48.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 52.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 29.9, + "variant": "DOM" + }, + "sonic-rs": { + "us": 45.7, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 27.8, + "variant": "read" + } + }, + "twitterescaped": { + "Boost.JSON": { + "us": 670.0, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 760.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1154.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1356.5, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 428.2, + "variant": "parse" + }, + "serde_json": { + "us": 729.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 842.3, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 397.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 654.5, + "variant": "Value" + }, + "yyjson": { + "us": 472.8, + "variant": "read" + } + }, + "update-center": { + "Boost.JSON": { + "us": 388.6, + "variant": "SAX" + }, + "Glaze": { + "us": 734.7, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1146.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 805.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 311.6, + "variant": "parse" + }, + "serde_json": { + "us": 488.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 643.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 340.2, + "variant": "DOM" + }, + "sonic-rs": { + "us": 381.1, + "variant": "Value" + }, + "yyjson": { + "us": 466.8, + "variant": "insitu (copy)" + } + } + }, + "x86-gcc13": { + "apache_builds": { + "Boost.JSON": { + "us": 109.9, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 134.9, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 319.0, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 170.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 67.9, + "variant": "parse" + }, + "serde_json": { + "us": 109.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 126.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 62.9, + "variant": "DOM" + }, + "sonic-rs": { + "us": 90.7, + "variant": "Value" + }, + "yyjson": { + "us": 88.3, + "variant": "read (raw numbers)" + } + }, + "github_events": { + "Boost.JSON": { + "us": 41.7, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 65.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 173.8, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 72.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 27.1, + "variant": "parse" + }, + "serde_json": { + "us": 51.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 53.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 28.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 41.1, + "variant": "Value" + }, + "yyjson": { + "us": 39.7, + "variant": "read" + } + }, + "google_maps_api_compact_response": { + "Boost.JSON": { + "us": 17.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 20.9, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 41.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 35.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 13.5, + "variant": "parse" + }, + "serde_json": { + "us": 16.7, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 23.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 13.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 13.8, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 11.3, + "variant": "read" + } + }, + "google_maps_api_response": { + "Boost.JSON": { + "us": 27.9, + "variant": "SAX" + }, + "Glaze": { + "us": 27.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 53.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 43.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 17.7, + "variant": "accept" + }, + "serde_json": { + "us": 26.4, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 27.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 15.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 23.3, + "variant": "Value" + }, + "yyjson": { + "us": 18.0, + "variant": "read" + } + }, + "gsoc-2018": { + "Boost.JSON": { + "us": 1096.0, + "variant": "SAX" + }, + "Glaze": { + "us": 1814.2, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 7708.8, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1704.4, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1167.2, + "variant": "accept" + }, + "serde_json": { + "us": 1464.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 2005.8, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1166.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1114.9, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1861.3, + "variant": "insitu (copy)" + } + }, + "instruments": { + "Boost.JSON": { + "us": 226.8, + "variant": "SAX" + }, + "Glaze": { + "us": 211.2, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 504.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 329.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 148.5, + "variant": "parse" + }, + "serde_json": { + "us": 206.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 256.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 125.9, + "variant": "DOM" + }, + "sonic-rs": { + "us": 225.3, + "variant": "Value" + }, + "yyjson": { + "us": 162.5, + "variant": "read" + } + }, + "marine_ik": { + "Boost.JSON": { + "us": 2898.5, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 3453.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 7600.7, + "variant": "SAX" + }, + "nlohmann json": { + "us": 7361.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 3670.6, + "variant": "accept" + }, + "serde_json": { + "us": 4143.5, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 7077.0, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 4312.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 4871.1, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 4175.9, + "variant": "read (raw numbers)" + } + }, + "mesh": { + "Boost.JSON": { + "us": 983.8, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 709.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 2565.5, + "variant": "SAX" + }, + "nlohmann json": { + "us": 1933.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 806.9, + "variant": "accept" + }, + "serde_json": { + "us": 911.1, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 1679.5, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1204.4, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1211.3, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1122.3, + "variant": "read (raw numbers)" + } + }, + "mesh.pretty": { + "Boost.JSON": { + "us": 1049.2, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 1248.8, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 3791.7, + "variant": "SAX" + }, + "nlohmann json": { + "us": 2365.8, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 1425.8, + "variant": "parse" + }, + "serde_json": { + "us": 1521.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 2309.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 1399.3, + "variant": "DOM" + }, + "sonic-rs": { + "us": 1554.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 1838.5, + "variant": "read (raw numbers)" + } + }, + "numbers": { + "Boost.JSON": { + "us": 79.7, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 115.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 511.6, + "variant": "SAX" + }, + "nlohmann json": { + "us": 275.5, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 105.4, + "variant": "parse" + }, + "serde_json": { + "us": 164.3, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 271.6, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 199.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 159.1, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 177.2, + "variant": "read (raw numbers)" + } + }, + "random": { + "Boost.JSON": { + "us": 950.9, + "variant": "SAX" + }, + "Glaze": { + "us": 698.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1455.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1183.1, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 498.8, + "variant": "accept" + }, + "serde_json": { + "us": 792.9, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 779.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 419.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 506.2, + "variant": "Value" + }, + "yyjson": { + "us": 568.7, + "variant": "insitu (copy)" + } + }, + "repeat": { + "Boost.JSON": { + "us": 14.8, + "variant": "SAX" + }, + "Glaze": { + "us": 12.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 18.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 14.6, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 7.1, + "variant": "accept" + }, + "serde_json": { + "us": 12.8, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 10.6, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 6.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.7, + "variant": "Value" + }, + "yyjson": { + "us": 9.3, + "variant": "read" + } + }, + "semanticscholar-corpus": { + "Boost.JSON": { + "us": 6334.0, + "variant": "SAX" + }, + "Glaze": { + "us": 7753.2, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 25583.7, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 9055.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 4111.4, + "variant": "accept" + }, + "serde_json": { + "us": 6929.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 11228.2, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 8262.2, + "variant": "DOM" + }, + "sonic-rs": { + "us": 5179.9, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 6587.3, + "variant": "read" + } + }, + "tree-pretty": { + "Boost.JSON": { + "us": 39.4, + "variant": "SAX" + }, + "Glaze": { + "us": 40.4, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 88.9, + "variant": "SAX" + }, + "nlohmann json": { + "us": 58.0, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 24.1, + "variant": "parse" + }, + "serde_json": { + "us": 38.0, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 36.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 20.0, + "variant": "DOM" + }, + "sonic-rs": { + "us": 29.7, + "variant": "Value" + }, + "yyjson": { + "us": 22.7, + "variant": "insitu (copy)" + } + }, + "twitter_api_compact_response": { + "Boost.JSON": { + "us": 8.3, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 10.1, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 30.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 16.2, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 5.9, + "variant": "parse" + }, + "serde_json": { + "us": 8.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 12.1, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 6.5, + "variant": "DOM" + }, + "sonic-rs": { + "us": 7.4, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 6.7, + "variant": "insitu (copy)" + } + }, + "twitter_api_response": { + "Boost.JSON": { + "us": 12.0, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 13.9, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 39.5, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 20.9, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 7.4, + "variant": "parse" + }, + "serde_json": { + "us": 13.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 13.9, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 7.1, + "variant": "DOM" + }, + "sonic-rs": { + "us": 11.6, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 8.0, + "variant": "insitu (copy)" + } + }, + "twitter_timeline": { + "Boost.JSON": { + "us": 47.0, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 51.6, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 136.6, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 82.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 31.3, + "variant": "parse" + }, + "serde_json": { + "us": 48.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 52.4, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 32.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 45.7, + "variant": "IgnoredAny" + }, + "yyjson": { + "us": 30.4, + "variant": "insitu (copy)" + } + }, + "twitterescaped": { + "Boost.JSON": { + "us": 689.6, + "variant": "SAX (numbers: none)" + }, + "Glaze": { + "us": 736.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1449.1, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 1427.1, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 450.4, + "variant": "parse" + }, + "serde_json": { + "us": 729.2, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 842.3, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 440.7, + "variant": "DOM" + }, + "sonic-rs": { + "us": 654.5, + "variant": "Value" + }, + "yyjson": { + "us": 503.1, + "variant": "insitu (copy)" + } + }, + "update-center": { + "Boost.JSON": { + "us": 405.0, + "variant": "SAX" + }, + "Glaze": { + "us": 692.5, + "variant": "validate_json" + }, + "RapidJSON": { + "us": 1636.4, + "variant": "insitu (copy)" + }, + "nlohmann json": { + "us": 818.3, + "variant": "accept" + }, + "nlohmann json_document": { + "us": 338.5, + "variant": "parse" + }, + "serde_json": { + "us": 488.6, + "variant": "from_utf8 + IgnoredAny" + }, + "simd-json": { + "us": 643.7, + "variant": "tape (copy)" + }, + "simdjson": { + "us": 355.6, + "variant": "DOM" + }, + "sonic-rs": { + "us": 381.1, + "variant": "Value" + }, + "yyjson": { + "us": 468.6, + "variant": "read" + } + } + } +} \ No newline at end of file diff --git a/docs/mkdocs/scripts/figures/perf_blog.py b/docs/mkdocs/scripts/figures/perf_blog.py index 5882dde72..0ecee97bf 100644 --- a/docs/mkdocs/scripts/figures/perf_blog.py +++ b/docs/mkdocs/scripts/figures/perf_blog.py @@ -7,7 +7,11 @@ Generated files: - perf_blog_timeline_.svg: speedup over 3.12.0 of eight workloads at every develop commit that changed json.hpp or json_view.hpp since 3.12.0, one panel each - perf_blog_swar.svg: the eight-byte string test on one word of input +- perf_blog_overlap.svg: writing a short string with two overlapping 16-byte loads and stores +- perf_blog_digits.svg: converting eight ASCII digits with three multiplications - perf_blog_cliffs.svg: operations that were quadratic or worse, 3.12.0 against 3.13.0 (log scale) +- perf_blog_heldout.svg: validate on the 19 files we didn't tune on, json_document against the fastest library per + file (data/perf_heldout_validate.json) - perf_blog_usecases_.svg: libraries x use cases, time relative to the fastest fully validating library (data/perf_usecases_.json); perf_blog_tables.py prints the tables of the appendix from the same data @@ -43,6 +47,11 @@ def esc(s): return html.escape(s, quote=True).replace("&#", "&#") +def esc_md(s): + """esc() for text with _ or *, which the page's Markdown pass would pair across text elements as emphasis""" + return esc(s).replace("_", "_").replace("*", "*") + + def write(name, W, H, cls, tid, title, desc, body): s = ['' % (cls, W, H, tid, tid), @@ -114,6 +123,81 @@ def swar(): "at once, then the quote ends the string.", b) +def span(b, x0, x1, y, cls, label): + """a bracket under the cells from x0 to x1, tinted, with a label to its right or inside""" + b.append('' % (cls, x0, y, x1 - x0)) + b.append('' % (cls, x0, y)) + b.append('' % (cls, x1 - 4, y)) + b.append('%s' % ((x0 + x1) / 2, y + 16, label)) + + +# ---------- short strings: two overlapping 16-byte loads ---------- +def overlap(): + text = "profile_link_color" # a key of twitter.json, 18 bytes + n = len(text) + W = 640 + L, cw, top = 40, 31, 34 + X = lambda i: L + i * cw + b = ['a string of n = %d bytes: too long for one 16-byte vector, too short for a loop' % (L, n)] + for i, ch in enumerate(text): + both = n - 16 <= i < 16 + b.append('' % (X(i), top, cw - 4)) + if both: + b.append('' % (X(i), top, cw - 4)) + b.append('%s' % (X(i) + (cw - 4) / 2, top + 24, esc_md(ch))) + for i in (0, n - 16, 15, n - 1): + b.append('%d' % (X(i) + (cw - 4) / 2, top + 52, i)) + y = top + 66 + span(b, X(0), X(15) + cw - 4, y, "nj-charts-c1", "a = load 16 bytes at p") + span(b, X(n - 16), X(n - 1) + cw - 4, y + 30, "nj-charts-c2", "b = load 16 bytes at p + n " + MINUS + " 16") + y += 82 + b.append('Both loads lie inside the string, and together they cover all of it; bytes %d to 15 are in both.' % (L, y, n - 16)) + b.append('Test a and b for a quote, a backslash, a control character or 0x7F: none, so write' % (L, y + 22)) + b.append('store a at d, store b at d + n %s 16' % (L, y + 52, MINUS)) + b.append('The second store writes bytes %d to 15 again, with the same values. For any n from 16 to 32:' % (L, y + 80, n - 16)) + b.append('two loads, one test, two stores, no loop and no branch on the length.' % (L, y + 98)) + write("perf_blog_overlap.svg", W, y + 112, "nj-charts--swar", "nj-blog-overlap", + "Writing an 18-byte string with two overlapping 16-byte loads and stores", + "The 18 bytes of profile_link_color. Load a covers bytes 0 to 15, load b covers bytes 2 to 17, so bytes 2 to 15 " + "are in both. Neither contains a byte that needs escaping, so a is stored at the destination and b 2 bytes " + "later; the second store writes bytes 2 to 15 again with the same values. This works for any length from 16 to " + "32 bytes without a loop.", b) + + +# ---------- eight digits at a time: three multiplications ---------- +def digits(): + W = 600 + L, cw, h = 40, 64, 34 + X = lambda i: L + i * cw + steps = [ + ("eight ASCII digits in one 64-bit word (byte 0 is the lowest)", 1, list("12345678"), True), + ("& 0x0F0F0F0F0F0F0F0F: one digit value per byte", 1, list("12345678"), False), + ("× (10 · 2⁸ + 1) >> 8, every second byte kept: two digits per 16 bits", 2, ["12", "34", "56", "78"], False), + ("× (100 · 2¹⁶ + 1) >> 16, every second lane kept: four digits per 32 bits", 4, ["1234", "5678"], False), + ("× (10000 · 2³² + 1) >> 32: the value", 8, ["12345678"], False), + ] + b = [] + y = 20 + for k, (head, width, cells, ascii_) in enumerate(steps): + b.append('%s' % (L, y, esc(head))) + for j, c in enumerate(cells): + x = X(j * width) + b.append('' % (x, y + 10, width * cw - 6, h)) + if k == len(steps) - 1: + b.append('' % (x, y + 10, width * cw - 6, h)) + b.append('%s' % (x + (width * cw - 6) / 2, y + 10 + 23, esc(c))) + if ascii_: + b.append('0x%02X' % (x + (width * cw - 6) / 2, y + h + 26, ord(c))) + y += h + (58 if ascii_ else 40) + b.append('Each step combines neighboring lanes, in all lanes of the word at once:' % (L, y - 8)) + b.append('three multiplications instead of eight, and no branch.' % (L, y + 10)) + write("perf_blog_digits.svg", W, y + 22, "nj-charts--swar", "nj-blog-digits", + "Converting eight ASCII digits to their value with three multiplications", + "The text 12345678 as one word. Masking gives the digit values 1 to 8, one per byte. Multiplying by 10 times 2 to " + "the 8 plus 1 and shifting gives 12, 34, 56 and 78 in 16-bit lanes; multiplying by 100 times 2 to the 16 plus 1 " + "gives 1234 and 5678 in 32-bit lanes; multiplying by 10000 times 2 to the 32 plus 1 gives 12345678.", b) + + # ---------- overview: speedup per workload (Google Benchmark rows, 3.12.0 time / 3.13.0 time) ---------- # (group, label, speedup), copied from the table "The short version" OVERVIEW = [ @@ -355,6 +439,60 @@ def cliffs(): "Dot plot on a logarithmic time axis, less is better; an arrow leads from each 3.12.0 time to the 3.13.0 time. " + "; ".join(desc) + ".", b) +# ---------- validating the files we didn't tune on, file by file ---------- +# data/perf_heldout_validate.json: per platform, file and library the fastest fully validating way of the validate +# use case on the 19 other files of simdjson's jsonexamples (reused parsers not chosen), extracted from +# summarize.py --json of the held-out run +HELDOUT = [("mac", "Apple M1 Max", "nj-charts-json-dot"), ("x86-gcc", "x86-64, GCC 16.2", "nj-charts-ojson-dot")] + + +def heldout(): + data = json.load((HERE / "data" / "perf_heldout_validate.json").open()) + files = sorted(data["mac"]) + rel, winner = {}, {} + for plat, _, _ in HELDOUT: + for f in files: + libs = data[plat][f] + best = min(libs, key=lambda l: libs[l]["us"]) + rel[plat, f] = libs["nlohmann json_document"]["us"] / libs[best]["us"] + winner[plat, f] = UC_LIBS.get(best, best) + files.sort(key=lambda f: (rel["x86-gcc", f], rel["mac", f])) + W, L, R = 620, 262, 486 + lo, hi = 1.0, 1.55 + X = lambda r: L + (r - lo) / (hi - lo) * (R - L) + top, pitch = 58, 20 + axis_y = top + pitch * len(files) + b, desc = [], [] + for t in (1.0, 1.1, 1.2, 1.3, 1.4, 1.5): + b.append('' % (X(t), top - 8, X(t), axis_y)) + b.append('%.1f%s' % (X(t), axis_y + 16, t, TIMES)) + b.append('json_document’s time / the fastest library’s, less is better' % ((L + R) / 2, axis_y + 34)) + x = 8 + for plat, name, cls in HELDOUT: + b.append('%s' % (cls, x + 5, x + 15, esc_md(name))) + x += 30 + 7.6 * len(name) + b.append('fastest on x86-64' % (R + 14, top - 10)) + for i, f in enumerate(files): + y = top + i * pitch + 6 + b.append('%s' % (L - 10, y + 4, esc_md(f))) + for k, (plat, name, cls) in enumerate(HELDOUT): + r = rel[plat, f] + b.append('%s, %s: %.2f%s the time of %s' + % (cls, X(min(r, hi)), y - 3.5 + 7 * k, esc_md(f), esc_md(name), r, TIMES, esc_md(winner[plat, f]) if r > 1.0005 else "the fastest (it is the fastest)")) + w = winner["x86-gcc", f] + b.append('%s' + % ("" if w.startswith("nlohmann") else " nj-charts-best", R + 14, y + 4, esc_md("json_document" if w.startswith("nlohmann") else w))) + desc.append("%s: Mac %.2f, x86-64 %.2f (%s)" % (f, rel["mac", f], rel["x86-gcc", f], w)) + b.append('' % (X(1), top - 8, X(1), axis_y)) + b.append('fastest' % (X(1), top - 14)) + wins = {p: sum(rel[p, f] < 1.0005 for f in files) for p, _, _ in HELDOUT} + print("heldout: json_document fastest on %s" % wins) + write("perf_blog_heldout.svg", W, axis_y + 44, "nj-charts--blog", "nj-blog-heldout", + "Validating 19 files 3.13.0 was not tuned on: json_document's time relative to the fastest library per file", + "Dot plot per file, less is better; 1.0 means json_document is the fastest fully validating library. " + + "; ".join(desc) + ".", b) + + # ---------- the price: compile time of two programs against 3.12.0 ---------- # CPU time of the compiler in ms, median of 9 interleaved rounds, C++20, M1 Max (the post's appendix G) # (3.12.0, 3.13.0, 3.13.0 with a precompiled header, 3.13.0 as a module) @@ -628,6 +766,9 @@ def heatmap(platform, title): if __name__ == "__main__": swar() + overlap() + digits() + heldout() if OVERVIEW: overview() distribution()