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>
This commit is contained in:
Niels Lohmann committed 2026-10-30 15:29:50 +01:00
1 parent 540eb7c5f2
commit 647bb98ba6
28 files changed
+33603 -908

No files matched your search

+20 -1
View File
@@ -766,7 +766,7 @@ body:has(.nj-hero) .md-content {
/* figure captions: "Figure N." in bold, close to the figure, set in from the text column; figures and tables are
numbered per page, each with its own counter */
.md-content__inner { counter-reset: nj-figure nj-table; }
.md-content__inner { counter-reset: nj-figure nj-table nj-listing; }
.md-typeset :is(.nj-caption, .nj-charts-caption) {
max-width: none;
margin: .3rem 2rem 1.5rem;
@@ -787,6 +787,25 @@ body:has(.nj-hero) .md-content {
.md-typeset :is(.nj-caption, .nj-charts-caption) { margin-inline: 1rem; }
}
/* code captions: "Listing N." in bold, directly below the code block, in the figure caption style */
.md-typeset .nj-code-caption {
max-width: none;
margin: -.4rem 2rem 1.5rem;
font-size: .75rem;
line-height: 1.5;
text-align: left;
color: var(--md-default-fg-color--light);
}
.md-typeset .nj-code-caption::before {
counter-increment: nj-listing;
content: "Listing " counter(nj-listing) ". ";
font-weight: 700;
color: var(--md-default-fg-color);
}
@media screen and (max-width: 44.9375em) {
.md-typeset .nj-code-caption { margin-inline: 1rem; }
}
/* table captions: "Table N." in bold, directly below the table, in the figure caption style */
.md-typeset .nj-table-caption {
max-width: none;
+39
View File
@@ -47,6 +47,29 @@
paint-order: stroke; stroke: var(--md-default-bg-color); stroke-width: 4px; stroke-linejoin: round; }
.nj-charts .nj-charts-factor { fill: var(--nj-charts-ink2); font-size: 12px; font-weight: 600; text-anchor: middle; }
.nj-charts .nj-charts-note { fill: var(--nj-charts-ink2); font-size: 12px; }
/* heatmap cells (perf_blog_usecases_*.svg): green for the fastest, gray around twice the time, red for the slowest;
adjacent steps checked for CVD separation on the light and the slate surface; the numbers are in every cell */
.md-typeset svg.nj-charts--heat { max-width: 49rem; }
.nj-charts--heat { --nj-heat-0: #3fa557; --nj-heat-1: #8bcc95; --nj-heat-2: #ebeae6; --nj-heat-3: #f2ae9b;
--nj-heat-4: #dc5a43; --nj-heat-ink: #1b1b1b; --nj-heat-ink-strong: #1b1b1b; }
[data-md-color-scheme="slate"] .nj-charts--heat { --nj-heat-0: #3a9d50; --nj-heat-1: #2c6b3a; --nj-heat-2: #33353a;
--nj-heat-3: #8a3f2e; --nj-heat-4: #d95b3a; --nj-heat-ink: #e8e8e6; --nj-heat-ink-strong: #141414; }
.nj-charts .nj-heat-0 { fill: var(--nj-heat-0); }
.nj-charts .nj-heat-1 { fill: var(--nj-heat-1); }
.nj-charts .nj-heat-2 { fill: var(--nj-heat-2); }
.nj-charts .nj-heat-3 { fill: var(--nj-heat-3); }
.nj-charts .nj-heat-4 { fill: var(--nj-heat-4); }
.nj-charts .nj-heat-na { fill: none; stroke: var(--nj-charts-grid); stroke-width: 1; }
.nj-charts .nj-charts-cell { fill: var(--nj-heat-ink); font-size: 12px; font-variant-numeric: tabular-nums; }
.nj-charts :is(.nj-heat-0, .nj-heat-4) ~ .nj-charts-cell { fill: var(--nj-heat-ink-strong); }
.nj-charts .nj-charts-cell--small { font-size: 10.5px; }
.nj-charts .nj-heat-cell { cursor: default; outline: none; }
.nj-charts .nj-heat-cell:is(:hover, :focus-visible, .nj-heat-on) rect { stroke: var(--md-default-fg-color); stroke-width: 1.5; }
.nj-heat-tip { position: absolute; z-index: 5; max-width: 24rem; padding: .5rem .7rem; border-radius: 6px;
background: var(--md-default-bg-color); color: var(--md-default-fg-color);
box-shadow: 0 2px 10px rgba(0, 0, 0, .25); font-size: .68rem; line-height: 1.45; pointer-events: none; }
.nj-heat-tip strong { display: block; margin-bottom: .2rem; }
.nj-heat-tip[hidden] { display: none; }
.nj-charts .nj-charts-grid { stroke: var(--nj-charts-grid); stroke-width: 1; }
.nj-charts .nj-charts-zero, .nj-charts .nj-charts-axis { stroke: var(--nj-charts-base); stroke-width: 1.5; }
@@ -145,3 +168,19 @@
/* direct line labels replace the legend */
.nj-charts .nj-charts-name-json { fill: var(--nj-charts-json-c); font-weight: 600; }
.nj-charts .nj-charts-name-ojson { fill: var(--nj-charts-ojson-c); font-weight: 600; }
/* theme badges of home/blog/how_3_13_0_got_faster.md: the number of one of the eight themes, as a digit in a blue
circle, in headings, text, tables and the timeline figures (nj-theme-dot); "U" and other marks are gray */
.md-typeset .nj-theme { display: inline-flex; align-items: center; justify-content: center; box-sizing: border-box;
min-width: 1.45em; height: 1.45em; padding: 0 .3em; border-radius: .725em; vertical-align: .08em;
background: var(--nj-blue); color: var(--md-default-bg-color); font-size: .78em; font-weight: 700; line-height: 1;
font-variant-numeric: tabular-nums; text-decoration: none; }
.md-typeset a.nj-theme:is(:hover, :focus-visible) { background: var(--nj-blue-deep); color: var(--md-default-bg-color); }
.md-typeset .nj-theme--other { background: var(--md-default-fg-color--light); }
.md-typeset h2 .nj-theme { margin-right: .35em; vertical-align: .12em; }
.md-typeset .nj-theme-list > ul { list-style: none; margin-left: 0; }
.md-typeset .nj-theme-list > ul > li { margin-left: 0; padding-left: 2em; text-indent: -2em; }
.md-typeset .nj-theme-list > ul > li > .nj-theme { margin-right: .55em; text-indent: 0; }
.nj-charts .nj-theme-dot { fill: var(--nj-blue); }
.nj-charts .nj-theme-dot--other { fill: var(--nj-charts-ink2); }
.nj-charts .nj-theme-num { fill: var(--md-default-bg-color); font-size: 11px; font-weight: 700; }
File diff suppressed because it is too large. Load diff
+7 -7
View File
@@ -1,6 +1,6 @@
<svg class="nj-fig nj-charts nj-charts--blog" viewBox="0 0 600 380" role="img" aria-labelledby="nj-blog-cliffs nj-blog-cliffs-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-cliffs">Operations that grew quadratically or worse: time with 3.12.0 and 3.13.0, log scale</title>
<desc id="nj-blog-cliffs-d">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. diff() 64k numbers vs []: 4102 ms to 9.98 ms; diff() 20k objects vs half: 119 ms to 3.85 ms; parse() callback, 32k objects: 1334 ms to 11.5 ms; &lt; nested 24 deep: 62.6 ms to 0.002 ms; &lt; citm, 10x: 274 ms to 3.81 ms; flatten() citm, ordered_json: 253 ms to 1.37 ms; to_bson() 200 deep, 100x: 19.5 ms to 0.566 ms; push_back() 100k, diagnostics: 1514 ms to 4.98 ms; at(i) 10k, diagnostics: 43.2 ms to 0.081 ms.</desc>
<desc id="nj-blog-cliffs-d">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. diff() 64k numbers vs []: 4102 ms to 9.98 ms; diff() 20k objects vs half: 119 ms to 3.85 ms; parse() callback, 32k objects: 1334 ms to 11.5 ms; operator&lt; nested 24 deep: 62.6 ms to 0.002 ms; operator&lt; citm, 10x: 274 ms to 3.81 ms; flatten() citm, ordered_json: 253 ms to 1.37 ms; to_bson() 200 deep, 100x: 19.5 ms to 0.566 ms; push_back() 100k, diagnostics: 1514 ms to 4.98 ms; at(i) 10k, diagnostics: 43.2 ms to 0.081 ms.</desc>
<line class="nj-charts-grid" x1="250" y1="30" x2="250" y2="336"/>
<text class="nj-charts-tick" x="250" y="352">1 µs</text>
<line class="nj-charts-grid" x1="297.857" y1="30" x2="297.857" y2="336"/>
@@ -36,15 +36,15 @@
<circle class="nj-charts-ojson-dot" cx="543.132" cy="116" r="5"><title>parse() callback, 32k objects, 3.12.0: 1334 ms</title></circle>
<circle class="nj-charts-json-dot" cx="444.333" cy="116" r="5"><title>parse() callback, 32k objects, 3.13.0: 11.5 ms</title></circle>
<text class="nj-charts-factor" x="493.733" y="109">116&#215;</text>
<text class="nj-charts-rowlabel" x="240" y="154" text-anchor="end">&lt; nested 24 deep</text>
<text class="nj-charts-rowlabel" x="240" y="154" text-anchor="end">operator&lt; nested 24 deep</text>
<line class="nj-charts-axis" x1="473.55" y1="150" x2="271.406" y2="150" marker-end="url(#nj-blog-cliffs-head)"/>
<circle class="nj-charts-ojson-dot" cx="479.55" cy="150" r="5"><title>&lt; nested 24 deep, 3.12.0: 62.6 ms</title></circle>
<circle class="nj-charts-json-dot" cx="264.406" cy="150" r="5"><title>&lt; nested 24 deep, 3.13.0: 0.002 ms</title></circle>
<circle class="nj-charts-ojson-dot" cx="479.55" cy="150" r="5"><title>operator&lt; nested 24 deep, 3.12.0: 62.6 ms</title></circle>
<circle class="nj-charts-json-dot" cx="264.406" cy="150" r="5"><title>operator&lt; nested 24 deep, 3.13.0: 0.002 ms</title></circle>
<text class="nj-charts-factor" x="371.978" y="143">31300&#215;</text>
<text class="nj-charts-rowlabel" x="240" y="188" text-anchor="end">&lt; citm, 10x</text>
<text class="nj-charts-rowlabel" x="240" y="188" text-anchor="end">operator&lt; citm, 10x</text>
<line class="nj-charts-axis" x1="504.235" y1="184" x2="428.373" y2="184" marker-end="url(#nj-blog-cliffs-head)"/>
<circle class="nj-charts-ojson-dot" cx="510.235" cy="184" r="5"><title>&lt; citm, 10x, 3.12.0: 274 ms</title></circle>
<circle class="nj-charts-json-dot" cx="421.373" cy="184" r="5"><title>&lt; citm, 10x, 3.13.0: 3.81 ms</title></circle>
<circle class="nj-charts-ojson-dot" cx="510.235" cy="184" r="5"><title>operator&lt; citm, 10x, 3.12.0: 274 ms</title></circle>
<circle class="nj-charts-json-dot" cx="421.373" cy="184" r="5"><title>operator&lt; citm, 10x, 3.13.0: 3.81 ms</title></circle>
<text class="nj-charts-factor" x="465.804" y="177">72&#215;</text>
<text class="nj-charts-rowlabel" x="240" y="222" text-anchor="end">flatten() citm, ordered_json</text>
<line class="nj-charts-axis" x1="502.578" y1="218" x2="407.114" y2="218" marker-end="url(#nj-blog-cliffs-head)"/>

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

@@ -0,0 +1,36 @@
<svg class="nj-fig nj-charts nj-charts--blog" viewBox="0 0 560 250" role="img" aria-labelledby="nj-blog-dist nj-blog-dist-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-dist">Speedup of 3.13.0 over 3.12.0 for all 182 benchmarks of the suite</title>
<desc id="nj-blog-dist-d">Bars counting the benchmarks per speedup range: below 1x: 2; 1 to 1.5x: 23; 1.5 to 2x: 17; 2 to 3x: 57; 3 to 5x: 54; 5 to 10x: 24; 10x or more: 5. Median 2.9x, geometric mean 2.9x.</desc>
<line class="nj-charts-grid" x1="52" y1="196" x2="548" y2="196"/>
<text class="nj-charts-tick nj-charts-tick--r" x="46" y="200">0</text>
<line class="nj-charts-grid" x1="52" y1="144.571" x2="548" y2="144.571"/>
<text class="nj-charts-tick nj-charts-tick--r" x="46" y="148.571">20</text>
<line class="nj-charts-grid" x1="52" y1="93.1429" x2="548" y2="93.1429"/>
<text class="nj-charts-tick nj-charts-tick--r" x="46" y="97.1429">40</text>
<line class="nj-charts-grid" x1="52" y1="41.7143" x2="548" y2="41.7143"/>
<text class="nj-charts-tick nj-charts-tick--r" x="46" y="45.7143">60</text>
<rect class="nj-charts-c2" x="60.0" y="190.9" width="54.9" height="5.1" rx="3"><title>below 1&#215;: 2</title></rect>
<text class="nj-charts-val" x="87.4" y="185.9" text-anchor="middle">2</text>
<text class="nj-charts-tick" x="87.4" y="212.0">below 1&#215;</text>
<rect class="nj-charts-c1" x="130.9" y="136.9" width="54.9" height="59.1" rx="3"><title>1 to 1.5&#215;: 23</title></rect>
<text class="nj-charts-val" x="158.3" y="131.9" text-anchor="middle">23</text>
<text class="nj-charts-tick" x="158.3" y="212.0">1 to 1.5&#215;</text>
<rect class="nj-charts-c1" x="201.7" y="152.3" width="54.9" height="43.7" rx="3"><title>1.5 to 2&#215;: 17</title></rect>
<text class="nj-charts-val" x="229.1" y="147.3" text-anchor="middle">17</text>
<text class="nj-charts-tick" x="229.1" y="212.0">1.5 to 2&#215;</text>
<rect class="nj-charts-c1" x="272.6" y="49.4" width="54.9" height="146.6" rx="3"><title>2 to 3&#215;: 57</title></rect>
<text class="nj-charts-val" x="300.0" y="44.4" text-anchor="middle">57</text>
<text class="nj-charts-tick" x="300.0" y="212.0">2 to 3&#215;</text>
<rect class="nj-charts-c1" x="343.4" y="57.1" width="54.9" height="138.9" rx="3"><title>3 to 5&#215;: 54</title></rect>
<text class="nj-charts-val" x="370.9" y="52.1" text-anchor="middle">54</text>
<text class="nj-charts-tick" x="370.9" y="212.0">3 to 5&#215;</text>
<rect class="nj-charts-c1" x="414.3" y="134.3" width="54.9" height="61.7" rx="3"><title>5 to 10&#215;: 24</title></rect>
<text class="nj-charts-val" x="441.7" y="129.3" text-anchor="middle">24</text>
<text class="nj-charts-tick" x="441.7" y="212.0">5 to 10&#215;</text>
<rect class="nj-charts-c1" x="485.1" y="183.1" width="54.9" height="12.9" rx="3"><title>10&#215; or more: 5</title></rect>
<text class="nj-charts-val" x="512.6" y="178.1" text-anchor="middle">5</text>
<text class="nj-charts-tick" x="512.6" y="212.0">10&#215; or more</text>
<line class="nj-charts-axis" x1="52" y1="196" x2="548" y2="196"/>
<text class="nj-charts-tick" x="300" y="240">speedup over 3.12.0, more is better</text>
<text class="nj-charts-tick" transform="rotate(-90)" x="-106" y="14">number of benchmarks</text>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

+84 -84
View File
@@ -1,87 +1,87 @@
<svg class="nj-fig nj-charts nj-charts--blog" viewBox="0 0 560 614" role="img" aria-labelledby="nj-blog-overview nj-blog-overview-d" xmlns="http://www.w3.org/2000/svg">
<svg class="nj-fig nj-charts nj-charts--blog" viewBox="0 0 560 604" role="img" aria-labelledby="nj-blog-overview nj-blog-overview-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-overview">Speedup of 3.13.0 over 3.12.0 per workload, Apple M1 Max, Apple clang</title>
<desc id="nj-blog-overview-d">Horizontal bars of the speedup, more is better. twitter.json 3.0x; citm_catalog.json 4.1x; canada.json 3.5x; canada.json, indented 6.7x; citm, ordered_json 6.6x; twitter, std::ifstream 2.5x; citm, FILE* 4.8x; citm, accept() 7.0x; dump() twitter 6.7x; dump() canada 3.0x; dump(4) citm 4.6x; to_cbor() twitter 4.5x; twitter, memory 3.1x; twitter, FILE* 6.3x; diff() canada 10x; iterate canada 2.7x; copy + destroy citm 1.11x; == citm 1.04x.</desc>
<text class="nj-charts-panel" x="8" y="46">Parsing</text>
<text class="nj-charts-panel" x="8" y="270">Writing</text>
<text class="nj-charts-panel" x="8" y="398">Reading C&#8203;BOR</text>
<text class="nj-charts-panel" x="8" y="478">Values</text>
<line class="nj-charts-grid" x1="220" y1="34" x2="220" y2="586"/>
<text class="nj-charts-tick" x="220" y="602">1&#215;</text>
<line class="nj-charts-grid" x1="250" y1="34" x2="250" y2="586"/>
<text class="nj-charts-tick" x="250" y="602">2&#215;</text>
<line class="nj-charts-grid" x1="280" y1="34" x2="280" y2="586"/>
<text class="nj-charts-tick" x="280" y="602">3&#215;</text>
<line class="nj-charts-grid" x1="310" y1="34" x2="310" y2="586"/>
<text class="nj-charts-tick" x="310" y="602">4&#215;</text>
<line class="nj-charts-grid" x1="340" y1="34" x2="340" y2="586"/>
<text class="nj-charts-tick" x="340" y="602">5&#215;</text>
<line class="nj-charts-grid" x1="370" y1="34" x2="370" y2="586"/>
<text class="nj-charts-tick" x="370" y="602">6&#215;</text>
<line class="nj-charts-grid" x1="400" y1="34" x2="400" y2="586"/>
<text class="nj-charts-tick" x="400" y="602">7&#215;</text>
<line class="nj-charts-grid" x1="430" y1="34" x2="430" y2="586"/>
<text class="nj-charts-tick" x="430" y="602">8&#215;</text>
<line class="nj-charts-grid" x1="460" y1="34" x2="460" y2="586"/>
<text class="nj-charts-tick" x="460" y="602">9&#215;</text>
<line class="nj-charts-grid" x1="490" y1="34" x2="490" y2="586"/>
<text class="nj-charts-tick" x="490" y="602">10&#215;</text>
<line class="nj-charts-grid" x1="520" y1="34" x2="520" y2="586"/>
<text class="nj-charts-tick" x="520" y="602">11&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="68" text-anchor="end">twitter.json</text>
<path class="nj-charts-c1" d="M190 56 H276.6 Q280.6 56 280.6 60 V67 Q280.6 71 276.6 71 H190 Z"><title>twitter.json: 3.0&#215;</title></path>
<text class="nj-charts-val" x="285.6" y="68">3.0&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="92" text-anchor="end">citm_catalog.json</text>
<path class="nj-charts-c1" d="M190 80 H309.9 Q313.9 80 313.9 84 V91 Q313.9 95 309.9 95 H190 Z"><title>citm_catalog.json: 4.1&#215;</title></path>
<text class="nj-charts-val" x="318.9" y="92">4.1&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="116" text-anchor="end">canada.json</text>
<path class="nj-charts-c1" d="M190 104 H289.8 Q293.8 104 293.8 108 V115 Q293.8 119 289.8 119 H190 Z"><title>canada.json: 3.5&#215;</title></path>
<text class="nj-charts-val" x="298.8" y="116">3.5&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="140" text-anchor="end">canada.json, indented</text>
<path class="nj-charts-c1" d="M190 128 H388.2 Q392.2 128 392.2 132 V139 Q392.2 143 388.2 143 H190 Z"><title>canada.json, indented: 6.7&#215;</title></path>
<text class="nj-charts-val" x="397.2" y="140">6.7&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="164" text-anchor="end">citm, ordered_json</text>
<path class="nj-charts-c1" d="M190 152 H383.4 Q387.4 152 387.4 156 V163 Q387.4 167 383.4 167 H190 Z"><title>citm, ordered_json: 6.6&#215;</title></path>
<text class="nj-charts-val" x="392.4" y="164">6.6&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="188" text-anchor="end">twitter, std::ifstream</text>
<path class="nj-charts-c1" d="M190 176 H259.8 Q263.8 176 263.8 180 V187 Q263.8 191 259.8 191 H190 Z"><title>twitter, std::ifstream: 2.5&#215;</title></path>
<text class="nj-charts-val" x="268.8" y="188">2.5&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="212" text-anchor="end">citm, FILE*</text>
<path class="nj-charts-c1" d="M190 200 H328.8 Q332.8 200 332.8 204 V211 Q332.8 215 328.8 215 H190 Z"><title>citm, FILE*: 4.8&#215;</title></path>
<text class="nj-charts-val" x="337.8" y="212">4.8&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="236" text-anchor="end">citm, accept()</text>
<path class="nj-charts-c1" d="M190 224 H395.7 Q399.7 224 399.7 228 V235 Q399.7 239 395.7 239 H190 Z"><title>citm, accept(): 7.0&#215;</title></path>
<text class="nj-charts-val" x="404.7" y="236">7.0&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="292" text-anchor="end">dump() twitter</text>
<path class="nj-charts-c1" d="M190 280 H386.1 Q390.1 280 390.1 284 V291 Q390.1 295 386.1 295 H190 Z"><title>dump() twitter: 6.7&#215;</title></path>
<text class="nj-charts-val" x="395.1" y="292">6.7&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="316" text-anchor="end">dump() canada</text>
<path class="nj-charts-c1" d="M190 304 H274.5 Q278.5 304 278.5 308 V315 Q278.5 319 274.5 319 H190 Z"><title>dump() canada: 3.0&#215;</title></path>
<text class="nj-charts-val" x="283.5" y="316">3.0&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="340" text-anchor="end">dump(4) citm</text>
<path class="nj-charts-c1" d="M190 328 H324.9 Q328.9 328 328.9 332 V339 Q328.9 343 324.9 343 H190 Z"><title>dump(4) citm: 4.6&#215;</title></path>
<text class="nj-charts-val" x="333.9" y="340">4.6&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="364" text-anchor="end">to_cbor() twitter</text>
<path class="nj-charts-c1" d="M190 352 H321 Q325 352 325 356 V363 Q325 367 321 367 H190 Z"><title>to_cbor() twitter: 4.5&#215;</title></path>
<text class="nj-charts-val" x="330" y="364">4.5&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="420" text-anchor="end">twitter, memory</text>
<path class="nj-charts-c1" d="M190 408 H279.3 Q283.3 408 283.3 412 V419 Q283.3 423 279.3 423 H190 Z"><title>twitter, memory: 3.1&#215;</title></path>
<text class="nj-charts-val" x="288.3" y="420">3.1&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="444" text-anchor="end">twitter, FILE*</text>
<path class="nj-charts-c1" d="M190 432 H375.3 Q379.3 432 379.3 436 V443 Q379.3 447 375.3 447 H190 Z"><title>twitter, FILE*: 6.3&#215;</title></path>
<text class="nj-charts-val" x="384.3" y="444">6.3&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="500" text-anchor="end">diff() canada</text>
<path class="nj-charts-c1" d="M190 488 H499.2 Q503.2 488 503.2 492 V499 Q503.2 503 499.2 503 H190 Z"><title>diff() canada: 10&#215;</title></path>
<text class="nj-charts-val" x="508.2" y="500">10&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="524" text-anchor="end">iterate canada</text>
<path class="nj-charts-c1" d="M190 512 H266.7 Q270.7 512 270.7 516 V523 Q270.7 527 266.7 527 H190 Z"><title>iterate canada: 2.7&#215;</title></path>
<text class="nj-charts-val" x="275.7" y="524">2.7&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="548" text-anchor="end">copy + destroy citm</text>
<path class="nj-charts-c1" d="M190 536 H219.3 Q223.3 536 223.3 540 V547 Q223.3 551 219.3 551 H190 Z"><title>copy + destroy citm: 1.11&#215;</title></path>
<text class="nj-charts-val" x="228.3" y="548">1.11&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="572" text-anchor="end">== citm</text>
<path class="nj-charts-c1" d="M190 560 H217.2 Q221.2 560 221.2 564 V571 Q221.2 575 217.2 575 H190 Z"><title>== citm: 1.04&#215;</title></path>
<text class="nj-charts-val" x="226.2" y="572">1.04&#215;</text>
<line class="nj-charts-ref" x1="220" y1="34" x2="220" y2="586"/>
<line class="nj-charts-zero" x1="190" y1="34" x2="190" y2="586"/>
<text class="nj-charts-note" x="190" y="18">speedup over 3.12.0, more is better (the line at 1&#215; is 3.12.0)</text>
<text class="nj-charts-panel" x="8" y="20">Parsing</text>
<text class="nj-charts-panel" x="8" y="244">Writing</text>
<text class="nj-charts-panel" x="8" y="372">Reading C&#8203;BOR</text>
<text class="nj-charts-panel" x="8" y="452">Values</text>
<line class="nj-charts-grid" x1="220" y1="8" x2="220" y2="560"/>
<text class="nj-charts-tick" x="220" y="576">1&#215;</text>
<line class="nj-charts-grid" x1="250" y1="8" x2="250" y2="560"/>
<text class="nj-charts-tick" x="250" y="576">2&#215;</text>
<line class="nj-charts-grid" x1="280" y1="8" x2="280" y2="560"/>
<text class="nj-charts-tick" x="280" y="576">3&#215;</text>
<line class="nj-charts-grid" x1="310" y1="8" x2="310" y2="560"/>
<text class="nj-charts-tick" x="310" y="576">4&#215;</text>
<line class="nj-charts-grid" x1="340" y1="8" x2="340" y2="560"/>
<text class="nj-charts-tick" x="340" y="576">5&#215;</text>
<line class="nj-charts-grid" x1="370" y1="8" x2="370" y2="560"/>
<text class="nj-charts-tick" x="370" y="576">6&#215;</text>
<line class="nj-charts-grid" x1="400" y1="8" x2="400" y2="560"/>
<text class="nj-charts-tick" x="400" y="576">7&#215;</text>
<line class="nj-charts-grid" x1="430" y1="8" x2="430" y2="560"/>
<text class="nj-charts-tick" x="430" y="576">8&#215;</text>
<line class="nj-charts-grid" x1="460" y1="8" x2="460" y2="560"/>
<text class="nj-charts-tick" x="460" y="576">9&#215;</text>
<line class="nj-charts-grid" x1="490" y1="8" x2="490" y2="560"/>
<text class="nj-charts-tick" x="490" y="576">10&#215;</text>
<line class="nj-charts-grid" x1="520" y1="8" x2="520" y2="560"/>
<text class="nj-charts-tick" x="520" y="576">11&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="42" text-anchor="end">twitter.json</text>
<path class="nj-charts-c1" d="M190 30 H276.6 Q280.6 30 280.6 34 V41 Q280.6 45 276.6 45 H190 Z"><title>twitter.json: 3.0&#215;</title></path>
<text class="nj-charts-val" x="285.6" y="42">3.0&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="66" text-anchor="end">citm_catalog.json</text>
<path class="nj-charts-c1" d="M190 54 H309.9 Q313.9 54 313.9 58 V65 Q313.9 69 309.9 69 H190 Z"><title>citm_catalog.json: 4.1&#215;</title></path>
<text class="nj-charts-val" x="318.9" y="66">4.1&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="90" text-anchor="end">canada.json</text>
<path class="nj-charts-c1" d="M190 78 H289.8 Q293.8 78 293.8 82 V89 Q293.8 93 289.8 93 H190 Z"><title>canada.json: 3.5&#215;</title></path>
<text class="nj-charts-val" x="298.8" y="90">3.5&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="114" text-anchor="end">canada.json, indented</text>
<path class="nj-charts-c1" d="M190 102 H388.2 Q392.2 102 392.2 106 V113 Q392.2 117 388.2 117 H190 Z"><title>canada.json, indented: 6.7&#215;</title></path>
<text class="nj-charts-val" x="397.2" y="114">6.7&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="138" text-anchor="end">citm, ordered_json</text>
<path class="nj-charts-c1" d="M190 126 H383.4 Q387.4 126 387.4 130 V137 Q387.4 141 383.4 141 H190 Z"><title>citm, ordered_json: 6.6&#215;</title></path>
<text class="nj-charts-val" x="392.4" y="138">6.6&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="162" text-anchor="end">twitter, std::ifstream</text>
<path class="nj-charts-c1" d="M190 150 H259.8 Q263.8 150 263.8 154 V161 Q263.8 165 259.8 165 H190 Z"><title>twitter, std::ifstream: 2.5&#215;</title></path>
<text class="nj-charts-val" x="268.8" y="162">2.5&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="186" text-anchor="end">citm, FILE*</text>
<path class="nj-charts-c1" d="M190 174 H328.8 Q332.8 174 332.8 178 V185 Q332.8 189 328.8 189 H190 Z"><title>citm, FILE*: 4.8&#215;</title></path>
<text class="nj-charts-val" x="337.8" y="186">4.8&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="210" text-anchor="end">citm, accept()</text>
<path class="nj-charts-c1" d="M190 198 H395.7 Q399.7 198 399.7 202 V209 Q399.7 213 395.7 213 H190 Z"><title>citm, accept(): 7.0&#215;</title></path>
<text class="nj-charts-val" x="404.7" y="210">7.0&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="266" text-anchor="end">dump() twitter</text>
<path class="nj-charts-c1" d="M190 254 H386.1 Q390.1 254 390.1 258 V265 Q390.1 269 386.1 269 H190 Z"><title>dump() twitter: 6.7&#215;</title></path>
<text class="nj-charts-val" x="395.1" y="266">6.7&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="290" text-anchor="end">dump() canada</text>
<path class="nj-charts-c1" d="M190 278 H274.5 Q278.5 278 278.5 282 V289 Q278.5 293 274.5 293 H190 Z"><title>dump() canada: 3.0&#215;</title></path>
<text class="nj-charts-val" x="283.5" y="290">3.0&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="314" text-anchor="end">dump(4) citm</text>
<path class="nj-charts-c1" d="M190 302 H324.9 Q328.9 302 328.9 306 V313 Q328.9 317 324.9 317 H190 Z"><title>dump(4) citm: 4.6&#215;</title></path>
<text class="nj-charts-val" x="333.9" y="314">4.6&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="338" text-anchor="end">to_cbor() twitter</text>
<path class="nj-charts-c1" d="M190 326 H321 Q325 326 325 330 V337 Q325 341 321 341 H190 Z"><title>to_cbor() twitter: 4.5&#215;</title></path>
<text class="nj-charts-val" x="330" y="338">4.5&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="394" text-anchor="end">twitter, memory</text>
<path class="nj-charts-c1" d="M190 382 H279.3 Q283.3 382 283.3 386 V393 Q283.3 397 279.3 397 H190 Z"><title>twitter, memory: 3.1&#215;</title></path>
<text class="nj-charts-val" x="288.3" y="394">3.1&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="418" text-anchor="end">twitter, FILE*</text>
<path class="nj-charts-c1" d="M190 406 H375.3 Q379.3 406 379.3 410 V417 Q379.3 421 375.3 421 H190 Z"><title>twitter, FILE*: 6.3&#215;</title></path>
<text class="nj-charts-val" x="384.3" y="418">6.3&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="474" text-anchor="end">diff() canada</text>
<path class="nj-charts-c1" d="M190 462 H499.2 Q503.2 462 503.2 466 V473 Q503.2 477 499.2 477 H190 Z"><title>diff() canada: 10&#215;</title></path>
<text class="nj-charts-val" x="508.2" y="474">10&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="498" text-anchor="end">iterate canada</text>
<path class="nj-charts-c1" d="M190 486 H266.7 Q270.7 486 270.7 490 V497 Q270.7 501 266.7 501 H190 Z"><title>iterate canada: 2.7&#215;</title></path>
<text class="nj-charts-val" x="275.7" y="498">2.7&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="522" text-anchor="end">copy + destroy citm</text>
<path class="nj-charts-c1" d="M190 510 H219.3 Q223.3 510 223.3 514 V521 Q223.3 525 219.3 525 H190 Z"><title>copy + destroy citm: 1.11&#215;</title></path>
<text class="nj-charts-val" x="228.3" y="522">1.11&#215;</text>
<text class="nj-charts-rowlabel nj-charts-tick--r" x="182" y="546" text-anchor="end">== citm</text>
<path class="nj-charts-c1" d="M190 534 H217.2 Q221.2 534 221.2 538 V545 Q221.2 549 217.2 549 H190 Z"><title>== citm: 1.04&#215;</title></path>
<text class="nj-charts-val" x="226.2" y="546">1.04&#215;</text>
<line class="nj-charts-ref" x1="220" y1="8" x2="220" y2="560"/>
<line class="nj-charts-zero" x1="190" y1="8" x2="190" y2="560"/>
<text class="nj-charts-tick" x="355" y="594">speedup over 3.12.0 (3.12.0 = 1&#215;), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 8.2 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

@@ -0,0 +1,99 @@
<svg class="nj-fig nj-charts nj-charts--blog" viewBox="0 0 600 618" role="img" aria-labelledby="nj-blog-price nj-blog-price-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-price">Compile time of two programs with 3.13.0, alone, with a precompiled header and as a module, compared with 3.12.0</title>
<desc id="nj-blog-price-d">Horizontal bars of the change in compile time against 3.12.0, less is better. Apple clang 21, -O0 (debug), count_numbers, 3.13.0: +20 %; Apple clang 21, -O0 (debug), count_numbers, 3.13.0, precompiled header: -29 %; Apple clang 21, -O0 (debug), count_numbers, 3.13.0, module: -16 %; Apple clang 21, -O0 (debug), server_config, 3.13.0: +30 %; Apple clang 21, -O0 (debug), server_config, 3.13.0, precompiled header: -31 %; Apple clang 21, -O0 (debug), server_config, 3.13.0, module: -5 %; Apple clang 21, -O2, count_numbers, 3.13.0: +47 %; Apple clang 21, -O2, count_numbers, 3.13.0, precompiled header: +8 %; Apple clang 21, -O2, count_numbers, 3.13.0, module: +19 %; Apple clang 21, -O2, server_config, 3.13.0: +49 %; Apple clang 21, -O2, server_config, 3.13.0, precompiled header: +11 %; Apple clang 21, -O2, server_config, 3.13.0, module: +36 %; G&#8203;CC 16, -O0 (debug), count_numbers, 3.13.0: +63 %; G&#8203;CC 16, -O0 (debug), count_numbers, 3.13.0, precompiled header: +9 %; G&#8203;CC 16, -O0 (debug), count_numbers, 3.13.0, module: +15 %; G&#8203;CC 16, -O0 (debug), server_config, 3.13.0: +40 %; G&#8203;CC 16, -O0 (debug), server_config, 3.13.0, precompiled header: +6 %; G&#8203;CC 16, -O0 (debug), server_config, 3.13.0, module: +10 %; G&#8203;CC 16, -O2, count_numbers, 3.13.0: +48 %; G&#8203;CC 16, -O2, count_numbers, 3.13.0, precompiled header: +28 %; G&#8203;CC 16, -O2, count_numbers, 3.13.0, module: +24 %; G&#8203;CC 16, -O2, server_config, 3.13.0: +52 %; G&#8203;CC 16, -O2, server_config, 3.13.0, precompiled header: +36 %; G&#8203;CC 16, -O2, server_config, 3.13.0, module: +32 %.</desc>
<rect class="nj-charts-c2" x="8" y="6" width="12" height="12" rx="3"/>
<text class="nj-charts-leg" x="26" y="16.5">3.13.0</text>
<rect class="nj-charts-c1" x="97.2" y="6" width="12" height="12" rx="3"/>
<text class="nj-charts-leg" x="115.2" y="16.5">3.13.0, precompiled header</text>
<rect class="nj-charts-c3" x="350.4" y="6" width="12" height="12" rx="3"/>
<text class="nj-charts-leg" x="368.4" y="16.5">3.13.0, module</text>
<text class="nj-charts-tick" x="320.833" y="46">as fast as 3.12.0</text>
<text class="nj-charts-panel" x="8" y="68">Apple clang 21, -O0 (debug)</text>
<line class="nj-charts-grid" x1="184.167" y1="74" x2="184.167" y2="170"/>
<line class="nj-charts-grid" x1="252.5" y1="74" x2="252.5" y2="170"/>
<line class="nj-charts-grid" x1="389.167" y1="74" x2="389.167" y2="170"/>
<line class="nj-charts-grid" x1="457.5" y1="74" x2="457.5" y2="170"/>
<line class="nj-charts-grid" x1="525.833" y1="74" x2="525.833" y2="170"/>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="101" text-anchor="end">count_numbers</text>
<path class="nj-charts-c2" d="M320.833 78 H385.167 Q389.167 78 389.167 82 V85 Q389.167 89 385.167 89 H320.833 Z"><title>count_numbers, Apple clang 21, -O0 (debug), 3.13.0: 1,155 ms against 959 ms with 3.12.0 (+20 %)</title></path>
<text class="nj-charts-val" x="394.167" y="87.5">+20 %</text>
<path class="nj-charts-c1" d="M320.833 92 H225.75 Q221.75 92 221.75 96 V99 Q221.75 103 225.75 103 H320.833 Z"><title>count_numbers, Apple clang 21, -O0 (debug), 3.13.0, precompiled header: 679 ms against 959 ms with 3.12.0 (&#8722;29 %)</title></path>
<text class="nj-charts-val" x="216.75" y="101.5" text-anchor="end">&#8722;29 %</text>
<path class="nj-charts-c3" d="M320.833 106 H270.167 Q266.167 106 266.167 110 V113 Q266.167 117 270.167 117 H320.833 Z"><title>count_numbers, Apple clang 21, -O0 (debug), 3.13.0, module: 804 ms against 959 ms with 3.12.0 (&#8722;16 %)</title></path>
<text class="nj-charts-val" x="261.167" y="115.5" text-anchor="end">&#8722;16 %</text>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="150" text-anchor="end">server_config</text>
<path class="nj-charts-c2" d="M320.833 127 H419.333 Q423.333 127 423.333 131 V134 Q423.333 138 419.333 138 H320.833 Z"><title>server_config, Apple clang 21, -O0 (debug), 3.13.0: 1,445 ms against 1,108 ms with 3.12.0 (+30 %)</title></path>
<text class="nj-charts-val" x="428.333" y="136.5">+30 %</text>
<path class="nj-charts-c1" d="M320.833 141 H218.917 Q214.917 141 214.917 145 V148 Q214.917 152 218.917 152 H320.833 Z"><title>server_config, Apple clang 21, -O0 (debug), 3.13.0, precompiled header: 763 ms against 1,108 ms with 3.12.0 (&#8722;31 %)</title></path>
<text class="nj-charts-val" x="209.917" y="150.5" text-anchor="end">&#8722;31 %</text>
<path class="nj-charts-c3" d="M320.833 155 H307.75 Q303.75 155 303.75 159 V162 Q303.75 166 307.75 166 H320.833 Z"><title>server_config, Apple clang 21, -O0 (debug), 3.13.0, module: 1,057 ms against 1,108 ms with 3.12.0 (&#8722;5 %)</title></path>
<text class="nj-charts-val" x="298.75" y="164.5" text-anchor="end">&#8722;5 %</text>
<text class="nj-charts-panel" x="8" y="198">Apple clang 21, -O2</text>
<line class="nj-charts-grid" x1="184.167" y1="204" x2="184.167" y2="300"/>
<line class="nj-charts-grid" x1="252.5" y1="204" x2="252.5" y2="300"/>
<line class="nj-charts-grid" x1="389.167" y1="204" x2="389.167" y2="300"/>
<line class="nj-charts-grid" x1="457.5" y1="204" x2="457.5" y2="300"/>
<line class="nj-charts-grid" x1="525.833" y1="204" x2="525.833" y2="300"/>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="231" text-anchor="end">count_numbers</text>
<path class="nj-charts-c2" d="M320.833 208 H477.417 Q481.417 208 481.417 212 V215 Q481.417 219 477.417 219 H320.833 Z"><title>count_numbers, Apple clang 21, -O2, 3.13.0: 1,868 ms against 1,269 ms with 3.12.0 (+47 %)</title></path>
<text class="nj-charts-val" x="486.417" y="217.5">+47 %</text>
<path class="nj-charts-c1" d="M320.833 222 H344.167 Q348.167 222 348.167 226 V229 Q348.167 233 344.167 233 H320.833 Z"><title>count_numbers, Apple clang 21, -O2, 3.13.0, precompiled header: 1,364 ms against 1,269 ms with 3.12.0 (+8 %)</title></path>
<text class="nj-charts-val" x="353.167" y="231.5">+8 %</text>
<path class="nj-charts-c3" d="M320.833 236 H381.75 Q385.75 236 385.75 240 V243 Q385.75 247 381.75 247 H320.833 Z"><title>count_numbers, Apple clang 21, -O2, 3.13.0, module: 1,513 ms against 1,269 ms with 3.12.0 (+19 %)</title></path>
<text class="nj-charts-val" x="390.75" y="245.5">+19 %</text>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="280" text-anchor="end">server_config</text>
<path class="nj-charts-c2" d="M320.833 257 H484.25 Q488.25 257 488.25 261 V264 Q488.25 268 484.25 268 H320.833 Z"><title>server_config, Apple clang 21, -O2, 3.13.0: 2,354 ms against 1,577 ms with 3.12.0 (+49 %)</title></path>
<text class="nj-charts-val" x="493.25" y="266.5">+49 %</text>
<path class="nj-charts-c1" d="M320.833 271 H354.417 Q358.417 271 358.417 275 V278 Q358.417 282 354.417 282 H320.833 Z"><title>server_config, Apple clang 21, -O2, 3.13.0, precompiled header: 1,749 ms against 1,577 ms with 3.12.0 (+11 %)</title></path>
<text class="nj-charts-val" x="363.417" y="280.5">+11 %</text>
<path class="nj-charts-c3" d="M320.833 285 H439.833 Q443.833 285 443.833 289 V292 Q443.833 296 439.833 296 H320.833 Z"><title>server_config, Apple clang 21, -O2, 3.13.0, module: 2,141 ms against 1,577 ms with 3.12.0 (+36 %)</title></path>
<text class="nj-charts-val" x="448.833" y="294.5">+36 %</text>
<text class="nj-charts-panel" x="8" y="328">G&#8203;CC 16, -O0 (debug)</text>
<line class="nj-charts-grid" x1="184.167" y1="334" x2="184.167" y2="430"/>
<line class="nj-charts-grid" x1="252.5" y1="334" x2="252.5" y2="430"/>
<line class="nj-charts-grid" x1="389.167" y1="334" x2="389.167" y2="430"/>
<line class="nj-charts-grid" x1="457.5" y1="334" x2="457.5" y2="430"/>
<line class="nj-charts-grid" x1="525.833" y1="334" x2="525.833" y2="430"/>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="361" text-anchor="end">count_numbers</text>
<path class="nj-charts-c2" d="M320.833 338 H532.083 Q536.083 338 536.083 342 V345 Q536.083 349 532.083 349 H320.833 Z"><title>count_numbers, G&#8203;CC 16, -O0 (debug), 3.13.0: 2,346 ms against 1,444 ms with 3.12.0 (+63 %)</title></path>
<text class="nj-charts-val" x="541.083" y="347.5">+63 %</text>
<path class="nj-charts-c1" d="M320.833 352 H347.583 Q351.583 352 351.583 356 V359 Q351.583 363 347.583 363 H320.833 Z"><title>count_numbers, G&#8203;CC 16, -O0 (debug), 3.13.0, precompiled header: 1,579 ms against 1,444 ms with 3.12.0 (+9 %)</title></path>
<text class="nj-charts-val" x="356.583" y="361.5">+9 %</text>
<path class="nj-charts-c3" d="M320.833 366 H368.083 Q372.083 366 372.083 370 V373 Q372.083 377 368.083 377 H320.833 Z"><title>count_numbers, G&#8203;CC 16, -O0 (debug), 3.13.0, module: 1,662 ms against 1,444 ms with 3.12.0 (+15 %)</title></path>
<text class="nj-charts-val" x="377.083" y="375.5">+15 %</text>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="410" text-anchor="end">server_config</text>
<path class="nj-charts-c2" d="M320.833 387 H453.5 Q457.5 387 457.5 391 V394 Q457.5 398 453.5 398 H320.833 Z"><title>server_config, G&#8203;CC 16, -O0 (debug), 3.13.0: 2,782 ms against 1,985 ms with 3.12.0 (+40 %)</title></path>
<text class="nj-charts-val" x="462.5" y="396.5">+40 %</text>
<path class="nj-charts-c1" d="M320.833 401 H337.333 Q341.333 401 341.333 405 V408 Q341.333 412 337.333 412 H320.833 Z"><title>server_config, G&#8203;CC 16, -O0 (debug), 3.13.0, precompiled header: 2,113 ms against 1,985 ms with 3.12.0 (+6 %)</title></path>
<text class="nj-charts-val" x="346.333" y="410.5">+6 %</text>
<path class="nj-charts-c3" d="M320.833 415 H351 Q355 415 355 419 V422 Q355 426 351 426 H320.833 Z"><title>server_config, G&#8203;CC 16, -O0 (debug), 3.13.0, module: 2,181 ms against 1,985 ms with 3.12.0 (+10 %)</title></path>
<text class="nj-charts-val" x="360" y="424.5">+10 %</text>
<text class="nj-charts-panel" x="8" y="458">G&#8203;CC 16, -O2</text>
<line class="nj-charts-grid" x1="184.167" y1="464" x2="184.167" y2="560"/>
<line class="nj-charts-grid" x1="252.5" y1="464" x2="252.5" y2="560"/>
<line class="nj-charts-grid" x1="389.167" y1="464" x2="389.167" y2="560"/>
<line class="nj-charts-grid" x1="457.5" y1="464" x2="457.5" y2="560"/>
<line class="nj-charts-grid" x1="525.833" y1="464" x2="525.833" y2="560"/>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="491" text-anchor="end">count_numbers</text>
<path class="nj-charts-c2" d="M320.833 468 H480.833 Q484.833 468 484.833 472 V475 Q484.833 479 480.833 479 H320.833 Z"><title>count_numbers, G&#8203;CC 16, -O2, 3.13.0: 3,453 ms against 2,327 ms with 3.12.0 (+48 %)</title></path>
<text class="nj-charts-val" x="489.833" y="477.5">+48 %</text>
<path class="nj-charts-c1" d="M320.833 482 H412.5 Q416.5 482 416.5 486 V489 Q416.5 493 412.5 493 H320.833 Z"><title>count_numbers, G&#8203;CC 16, -O2, 3.13.0, precompiled header: 2,972 ms against 2,327 ms with 3.12.0 (+28 %)</title></path>
<text class="nj-charts-val" x="421.5" y="491.5">+28 %</text>
<path class="nj-charts-c3" d="M320.833 496 H398.833 Q402.833 496 402.833 500 V503 Q402.833 507 398.833 507 H320.833 Z"><title>count_numbers, G&#8203;CC 16, -O2, 3.13.0, module: 2,895 ms against 2,327 ms with 3.12.0 (+24 %)</title></path>
<text class="nj-charts-val" x="407.833" y="505.5">+24 %</text>
<text class="nj-charts-rowlabel nj-charts-code" x="142" y="540" text-anchor="end">server_config</text>
<path class="nj-charts-c2" d="M320.833 517 H494.5 Q498.5 517 498.5 521 V524 Q498.5 528 494.5 528 H320.833 Z"><title>server_config, G&#8203;CC 16, -O2, 3.13.0: 4,389 ms against 2,889 ms with 3.12.0 (+52 %)</title></path>
<text class="nj-charts-val" x="503.5" y="526.5">+52 %</text>
<path class="nj-charts-c1" d="M320.833 531 H439.833 Q443.833 531 443.833 535 V538 Q443.833 542 439.833 542 H320.833 Z"><title>server_config, G&#8203;CC 16, -O2, 3.13.0, precompiled header: 3,942 ms against 2,889 ms with 3.12.0 (+36 %)</title></path>
<text class="nj-charts-val" x="448.833" y="540.5">+36 %</text>
<path class="nj-charts-c3" d="M320.833 545 H426.167 Q430.167 545 430.167 549 V552 Q430.167 556 426.167 556 H320.833 Z"><title>server_config, G&#8203;CC 16, -O2, 3.13.0, module: 3,826 ms against 2,889 ms with 3.12.0 (+32 %)</title></path>
<text class="nj-charts-val" x="435.167" y="554.5">+32 %</text>
<line class="nj-charts-ref" x1="320.833" y1="52" x2="320.833" y2="574"/>
<text class="nj-charts-tick" x="184.167" y="590">&#8722;40 %</text>
<text class="nj-charts-tick" x="252.5" y="590">&#8722;20 %</text>
<text class="nj-charts-tick" x="320.833" y="590">0</text>
<text class="nj-charts-tick" x="389.167" y="590">+20 %</text>
<text class="nj-charts-tick" x="457.5" y="590">+40 %</text>
<text class="nj-charts-tick" x="525.833" y="590">+60 %</text>
<text class="nj-charts-tick" x="355" y="608">compile time compared with 3.12.0, less is better</text>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

@@ -1,38 +1,45 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-accept_twitter nj-blog-tl-accept_twitter-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-accept_twitter">accept() twitter.json: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-accept_twitter-d">accept() twitter.json: speedup over 3.12.0 at each of 317 commits, ending at 5.0x. Labeled steps: #5234, #5283, #5592, #5809, #5810, #5853.</desc>
<desc id="nj-blog-tl-accept_twitter-d">accept() twitter.json: speedup over 3.12.0 at each of 317 commits, ending at 5.0x. Labeled steps, by theme: 4, 1, 4, 4, 2, 2.</desc>
<text class="nj-charts-panel" x="8" y="18">accept() twitter.json</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="159.333" x2="330" y2="159.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="163.333">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="110.667" x2="330" y2="110.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="114.667">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">8&#215;</text>
<line class="nj-charts-grid" x1="44" y1="160.667" x2="330" y2="160.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="164.667">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="113.333" x2="330" y2="113.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="117.333">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">8&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.1 45.8,208.1 45.8,207.8 46.7,207.8 46.7,208.0 47.6,208.0 47.6,207.7 48.5,207.7 48.5,207.9 49.4,207.9 49.4,208.0 50.3,208.0 50.3,208.1 51.2,208.1 51.2,208.4 52.1,208.4 52.1,207.1 53.1,207.1 53.1,207.9 54.0,207.9 54.0,208.2 54.9,208.2 54.9,207.9 55.8,207.9 55.8,207.9 56.7,207.9 56.7,207.7 57.6,207.7 57.6,207.9 58.5,207.9 58.5,207.8 59.4,207.8 59.4,207.7 60.3,207.7 60.3,208.2 61.2,208.2 61.2,207.2 62.1,207.2 62.1,208.0 63.0,208.0 63.0,208.0 63.9,208.0 63.9,207.8 64.8,207.8 64.8,207.9 65.7,207.9 65.7,207.9 66.6,207.9 66.6,207.1 67.5,207.1 67.5,207.8 68.4,207.8 68.4,207.5 69.3,207.5 69.3,207.8 70.2,207.8 70.2,207.9 71.2,207.9 71.2,207.9 72.1,207.9 72.1,207.3 73.0,207.3 73.0,207.7 73.9,207.7 73.9,207.6 74.8,207.6 74.8,207.7 75.7,207.7 75.7,208.1 76.6,208.1 76.6,207.8 77.5,207.8 77.5,207.1 78.4,207.1 78.4,207.9 79.3,207.9 79.3,207.1 80.2,207.1 80.2,207.8 81.1,207.8 81.1,207.3 82.0,207.3 82.0,208.1 82.9,208.1 82.9,207.6 83.8,207.6 83.8,207.6 84.7,207.6 84.7,208.1 85.6,208.1 85.6,208.3 86.5,208.3 86.5,207.8 87.4,207.8 87.4,207.7 88.3,207.7 88.3,207.9 89.3,207.9 89.3,207.8 90.2,207.8 90.2,207.5 91.1,207.5 91.1,207.9 92.0,207.9 92.0,207.8 92.9,207.8 92.9,208.0 93.8,208.0 93.8,194.2 94.7,194.2 94.7,194.9 95.6,194.9 95.6,195.2 96.5,195.2 96.5,194.7 97.4,194.7 97.4,195.3 98.3,195.3 98.3,194.2 99.2,194.2 99.2,194.3 100.1,194.3 100.1,195.0 101.0,195.0 101.0,194.7 101.9,194.7 101.9,194.8 102.8,194.8 102.8,195.3 103.7,195.3 103.7,194.2 104.6,194.2 104.6,194.8 105.5,194.8 105.5,194.9 106.4,194.9 106.4,195.3 107.4,195.3 107.4,194.9 108.3,194.9 108.3,195.0 109.2,195.0 109.2,194.9 110.1,194.9 110.1,195.5 111.0,195.5 111.0,194.7 111.9,194.7 111.9,195.0 112.8,195.0 112.8,195.9 113.7,195.9 113.7,195.3 114.6,195.3 114.6,194.2 115.5,194.2 115.5,194.3 116.4,194.3 116.4,194.8 117.3,194.8 117.3,195.2 118.2,195.2 118.2,195.2 119.1,195.2 119.1,195.2 120.0,195.2 120.0,194.2 120.9,194.2 120.9,194.0 121.8,194.0 121.8,194.8 122.7,194.8 122.7,195.0 123.6,195.0 123.6,195.5 124.6,195.5 124.6,194.2 125.5,194.2 125.5,194.6 126.4,194.6 126.4,195.1 127.3,195.1 127.3,194.8 128.2,194.8 128.2,195.1 129.1,195.1 129.1,193.1 130.0,193.1 130.0,194.6 130.9,194.6 130.9,194.8 131.8,194.8 131.8,194.5 132.7,194.5 132.7,194.2 133.6,194.2 133.6,194.3 134.5,194.3 134.5,194.7 135.4,194.7 135.4,194.7 136.3,194.7 136.3,194.4 137.2,194.4 137.2,195.0 138.1,195.0 138.1,194.3 139.0,194.3 139.0,194.3 139.9,194.3 139.9,141.4 140.8,141.4 140.8,141.1 141.7,141.1 141.7,140.4 142.7,140.4 142.7,140.1 143.6,140.1 143.6,141.2 144.5,141.2 144.5,140.7 145.4,140.7 145.4,140.5 146.3,140.5 146.3,141.1 147.2,141.1 147.2,141.2 148.1,141.2 148.1,141.4 149.0,141.4 149.0,140.3 149.9,140.3 149.9,141.3 150.8,141.3 150.8,140.5 151.7,140.5 151.7,141.2 152.6,141.2 152.6,140.0 153.5,140.0 153.5,141.3 154.4,141.3 154.4,140.0 155.3,140.0 155.3,141.2 156.2,141.2 156.2,141.1 157.1,141.1 157.1,140.1 158.0,140.1 158.0,140.6 158.9,140.6 158.9,140.5 159.8,140.5 159.8,141.7 160.8,141.7 160.8,141.1 161.7,141.1 161.7,140.5 162.6,140.5 162.6,141.3 163.5,141.3 163.5,140.1 164.4,140.1 164.4,140.6 165.3,140.6 165.3,140.1 166.2,140.1 166.2,140.0 167.1,140.0 167.1,139.4 168.0,139.4 168.0,141.0 168.9,141.0 168.9,139.4 169.8,139.4 169.8,140.9 170.7,140.9 170.7,140.8 171.6,140.8 171.6,140.5 172.5,140.5 172.5,140.8 173.4,140.8 173.4,140.1 174.3,140.1 174.3,139.7 175.2,139.7 175.2,139.3 176.1,139.3 176.1,139.5 177.0,139.5 177.0,140.0 177.9,140.0 177.9,139.7 178.9,139.7 178.9,140.0 179.8,140.0 179.8,140.1 180.7,140.1 180.7,140.1 181.6,140.1 181.6,139.6 182.5,139.6 182.5,140.5 183.4,140.5 183.4,139.9 184.3,139.9 184.3,140.5 185.2,140.5 185.2,140.1 186.1,140.1 186.1,139.8 187.0,139.8 187.0,139.2 187.9,139.2 187.9,139.7 188.8,139.7 188.8,139.7 189.7,139.7 189.7,139.8 190.6,139.8 190.6,138.4 191.5,138.4 191.5,138.8 192.4,138.8 192.4,138.7 193.3,138.7 193.3,139.2 194.2,139.2 194.2,140.0 195.1,140.0 195.1,139.7 196.1,139.7 196.1,139.7 197.0,139.7 197.0,139.1 197.9,139.1 197.9,139.3 198.8,139.3 198.8,138.8 199.7,138.8 199.7,138.5 200.6,138.5 200.6,140.2 201.5,140.2 201.5,139.8 202.4,139.8 202.4,139.3 203.3,139.3 203.3,139.6 204.2,139.6 204.2,138.5 205.1,138.5 205.1,139.1 206.0,139.1 206.0,139.6 206.9,139.6 206.9,139.4 207.8,139.4 207.8,140.2 208.7,140.2 208.7,138.5 209.6,138.5 209.6,139.2 210.5,139.2 210.5,139.7 211.4,139.7 211.4,139.0 212.3,139.0 212.3,139.8 213.2,139.8 213.2,138.5 214.2,138.5 214.2,140.1 215.1,140.1 215.1,139.3 216.0,139.3 216.0,139.6 216.9,139.6 216.9,138.7 217.8,138.7 217.8,139.5 218.7,139.5 218.7,138.1 219.6,138.1 219.6,139.3 220.5,139.3 220.5,138.9 221.4,138.9 221.4,139.5 222.3,139.5 222.3,139.6 223.2,139.6 223.2,139.3 224.1,139.3 224.1,140.2 225.0,140.2 225.0,140.7 225.9,140.7 225.9,140.4 226.8,140.4 226.8,138.7 227.7,138.7 227.7,138.9 228.6,138.9 228.6,139.0 229.5,139.0 229.5,139.2 230.4,139.2 230.4,139.7 231.3,139.7 231.3,139.1 232.3,139.1 232.3,139.6 233.2,139.6 233.2,139.5 234.1,139.5 234.1,140.1 235.0,140.1 235.0,138.7 235.9Line truncated
<circle class="nj-charts-json-dot" cx="93.8" cy="194.2" r="3.5"><title>#5234: 1.22&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="93.8" y1="54.0" x2="93.8" y2="189.2"/>
<text class="nj-charts-note" x="93.8" y="50.0" text-anchor="middle">#5234</text>
<circle class="nj-charts-json-dot" cx="139.9" cy="141.4" r="3.5"><title>#5283: 2.6&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.9" y1="54.0" x2="139.9" y2="136.4"/>
<text class="nj-charts-note" x="139.9" y="50.0" text-anchor="middle">#5283</text>
<circle class="nj-charts-json-dot" cx="243.1" cy="133.1" r="3.5"><title>#5592: 2.9&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="243.1" y1="54.0" x2="243.1" y2="128.1"/>
<text class="nj-charts-note" x="243.1" y="50.0" text-anchor="middle">#5592</text>
<circle class="nj-charts-json-dot" cx="265.7" cy="116.2" r="3.5"><title>#5809: 3.7&#215;</title></circle>
<circle class="nj-charts-json-dot" cx="266.6" cy="110.0" r="3.5"><title>#5810: 4.0&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="266.6" y1="41.0" x2="266.6" y2="105.0"/>
<text class="nj-charts-note" x="266.6" y="37.0" text-anchor="middle">#5809, #5810</text>
<circle class="nj-charts-json-dot" cx="299.2" cy="96.1" r="3.5"><title>#5853: 4.9&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="299.2" y1="54.0" x2="299.2" y2="91.1"/>
<text class="nj-charts-note" x="299.2" y="50.0" text-anchor="middle">#5853</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.1 45.8,208.1 45.8,207.8 46.7,207.8 46.7,208.0 47.6,208.0 47.6,207.7 48.5,207.7 48.5,207.9 49.4,207.9 49.4,208.0 50.3,208.0 50.3,208.1 51.2,208.1 51.2,208.4 52.1,208.4 52.1,207.1 53.1,207.1 53.1,207.9 54.0,207.9 54.0,208.2 54.9,208.2 54.9,207.9 55.8,207.9 55.8,207.9 56.7,207.9 56.7,207.7 57.6,207.7 57.6,207.9 58.5,207.9 58.5,207.8 59.4,207.8 59.4,207.7 60.3,207.7 60.3,208.2 61.2,208.2 61.2,207.3 62.1,207.3 62.1,208.0 63.0,208.0 63.0,208.0 63.9,208.0 63.9,207.8 64.8,207.8 64.8,207.9 65.7,207.9 65.7,207.9 66.6,207.9 66.6,207.2 67.5,207.2 67.5,207.8 68.4,207.8 68.4,207.6 69.3,207.6 69.3,207.8 70.2,207.8 70.2,207.9 71.2,207.9 71.2,207.9 72.1,207.9 72.1,207.4 73.0,207.4 73.0,207.7 73.9,207.7 73.9,207.6 74.8,207.6 74.8,207.7 75.7,207.7 75.7,208.1 76.6,208.1 76.6,207.8 77.5,207.8 77.5,207.1 78.4,207.1 78.4,207.9 79.3,207.9 79.3,207.1 80.2,207.1 80.2,207.8 81.1,207.8 81.1,207.3 82.0,207.3 82.0,208.1 82.9,208.1 82.9,207.6 83.8,207.6 83.8,207.6 84.7,207.6 84.7,208.1 85.6,208.1 85.6,208.3 86.5,208.3 86.5,207.8 87.4,207.8 87.4,207.7 88.3,207.7 88.3,207.9 89.3,207.9 89.3,207.8 90.2,207.8 90.2,207.5 91.1,207.5 91.1,207.9 92.0,207.9 92.0,207.8 92.9,207.8 92.9,208.0 93.8,208.0 93.8,194.6 94.7,194.6 94.7,195.3 95.6,195.3 95.6,195.6 96.5,195.6 96.5,195.1 97.4,195.1 97.4,195.6 98.3,195.6 98.3,194.6 99.2,194.6 99.2,194.7 100.1,194.7 100.1,195.3 101.0,195.3 101.0,195.1 101.9,195.1 101.9,195.1 102.8,195.1 102.8,195.6 103.7,195.6 103.7,194.6 104.6,194.6 104.6,195.2 105.5,195.2 105.5,195.3 106.4,195.3 106.4,195.6 107.4,195.6 107.4,195.3 108.3,195.3 108.3,195.4 109.2,195.4 109.2,195.2 110.1,195.2 110.1,195.8 111.0,195.8 111.0,195.1 111.9,195.1 111.9,195.3 112.8,195.3 112.8,196.2 113.7,196.2 113.7,195.7 114.6,195.7 114.6,194.5 115.5,194.5 115.5,194.7 116.4,194.7 116.4,195.1 117.3,195.1 117.3,195.6 118.2,195.6 118.2,195.6 119.1,195.6 119.1,195.5 120.0,195.5 120.0,194.6 120.9,194.6 120.9,194.4 121.8,194.4 121.8,195.1 122.7,195.1 122.7,195.4 123.6,195.4 123.6,195.8 124.6,195.8 124.6,194.6 125.5,194.6 125.5,195.0 126.4,195.0 126.4,195.4 127.3,195.4 127.3,195.1 128.2,195.1 128.2,195.5 129.1,195.5 129.1,193.5 130.0,193.5 130.0,194.9 130.9,194.9 130.9,195.1 131.8,195.1 131.8,194.8 132.7,194.8 132.7,194.6 133.6,194.6 133.6,194.7 134.5,194.7 134.5,195.1 135.4,195.1 135.4,195.0 136.3,195.0 136.3,194.7 137.2,194.7 137.2,195.3 138.1,195.3 138.1,194.6 139.0,194.6 139.0,194.7 139.9,194.7 139.9,143.3 140.8,143.3 140.8,143.0 141.7,143.0 141.7,142.2 142.7,142.2 142.7,141.9 143.6,141.9 143.6,143.0 144.5,143.0 144.5,142.6 145.4,142.6 145.4,142.4 146.3,142.4 146.3,142.9 147.2,142.9 147.2,143.1 148.1,143.1 148.1,143.2 149.0,143.2 149.0,142.1 149.9,142.1 149.9,143.1 150.8,143.1 150.8,142.4 151.7,142.4 151.7,143.0 152.6,143.0 152.6,141.8 153.5,141.8 153.5,143.1 154.4,143.1 154.4,141.9 155.3,141.9 155.3,143.1 156.2,143.1 156.2,142.9 157.1,142.9 157.1,142.0 158.0,142.0 158.0,142.5 158.9,142.5 158.9,142.4 159.8,142.4 159.8,143.5 160.8,143.5 160.8,142.9 161.7,142.9 161.7,142.3 162.6,142.3 162.6,143.1 163.5,143.1 163.5,141.9 164.4,141.9 164.4,142.4 165.3,142.4 165.3,141.9 166.2,141.9 166.2,141.8 167.1,141.8 167.1,141.3 168.0,141.3 168.0,142.9 168.9,142.9 168.9,141.2 169.8,141.2 169.8,142.8 170.7,142.8 170.7,142.6 171.6,142.6 171.6,142.3 172.5,142.3 172.5,142.7 173.4,142.7 173.4,142.0 174.3,142.0 174.3,141.5 175.2,141.5 175.2,141.2 176.1,141.2 176.1,141.4 177.0,141.4 177.0,141.9 177.9,141.9 177.9,141.6 178.9,141.6 178.9,141.8 179.8,141.8 179.8,142.0 180.7,142.0 180.7,142.0 181.6,142.0 181.6,141.5 182.5,141.5 182.5,142.4 183.4,142.4 183.4,141.7 184.3,141.7 184.3,142.4 185.2,142.4 185.2,141.9 186.1,141.9 186.1,141.7 187.0,141.7 187.0,141.1 187.9,141.1 187.9,141.5 188.8,141.5 188.8,141.6 189.7,141.6 189.7,141.7 190.6,141.7 190.6,140.3 191.5,140.3 191.5,140.7 192.4,140.7 192.4,140.6 193.3,140.6 193.3,141.0 194.2,141.0 194.2,141.8 195.1,141.8 195.1,141.6 196.1,141.6 196.1,141.5 197.0,141.5 197.0,141.0 197.9,141.0 197.9,141.1 198.8,141.1 198.8,140.7 199.7,140.7 199.7,140.4 200.6,140.4 200.6,142.1 201.5,142.1 201.5,141.7 202.4,141.7 202.4,141.2 203.3,141.2 203.3,141.5 204.2,141.5 204.2,140.4 205.1,140.4 205.1,141.0 206.0,141.0 206.0,141.5 206.9,141.5 206.9,141.2 207.8,141.2 207.8,142.1 208.7,142.1 208.7,140.4 209.6,140.4 209.6,141.1 210.5,141.1 210.5,141.5 211.4,141.5 211.4,140.9 212.3,140.9 212.3,141.7 213.2,141.7 213.2,140.4 214.2,140.4 214.2,141.9 215.1,141.9 215.1,141.1 216.0,141.1 216.0,141.4 216.9,141.4 216.9,140.6 217.8,140.6 217.8,141.4 218.7,141.4 218.7,140.1 219.6,140.1 219.6,141.2 220.5,141.2 220.5,140.8 221.4,140.8 221.4,141.4 222.3,141.4 222.3,141.5 223.2,141.5 223.2,141.2 224.1,141.2 224.1,142.0 225.0,142.0 225.0,142.6 225.9,142.6 225.9,142.3 226.8,142.3 226.8,140.6 227.7,140.6 227.7,140.8 228.6,140.8 228.6,140.9 229.5,140.9 229.5,141.1 230.4,141.1 230.4,141.6 231.3,141.6 231.3,141.0 232.3,141.0 232.3,141.5 233.2,141.5 233.2,141.4 234.1,141.4 234.1,142.0 235.0,142.0 235.0,140.6 235.9Line truncated
<circle class="nj-charts-json-dot" cx="93.8" cy="194.6" r="3.5"><title>#5234: 1.22&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="93.8" y1="54.0" x2="93.8" y2="189.6"/>
<circle class="nj-theme-dot" cx="93.8" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="93.8" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="139.9" cy="143.3" r="3.5"><title>#5283: 2.6&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.9" y1="54.0" x2="139.9" y2="138.3"/>
<circle class="nj-theme-dot" cx="139.9" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="139.9" y="50.0" text-anchor="middle">1</text>
<circle class="nj-charts-json-dot" cx="243.1" cy="135.2" r="3.5"><title>#5592: 2.9&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="243.1" y1="54.0" x2="243.1" y2="130.2"/>
<circle class="nj-theme-dot" cx="243.1" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="243.1" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="265.7" cy="118.7" r="3.5"><title>#5809: 3.7&#215;</title></circle>
<circle class="nj-charts-json-dot" cx="266.6" cy="112.7" r="3.5"><title>#5810: 4.0&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="266.6" y1="36.0" x2="266.6" y2="107.7"/>
<circle class="nj-theme-dot" cx="257.6" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="257.6" y="32.0" text-anchor="middle">4</text>
<circle class="nj-theme-dot" cx="275.6" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="275.6" y="32.0" text-anchor="middle">2</text>
<circle class="nj-charts-json-dot" cx="299.2" cy="99.2" r="3.5"><title>#5853: 4.9&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="299.2" y1="54.0" x2="299.2" y2="94.2"/>
<circle class="nj-theme-dot" cx="299.2" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="299.2" y="50.0" text-anchor="middle">2</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@@ -1,28 +1,30 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-dump_canada nj-blog-tl-dump_canada-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-dump_canada">dump() canada.json: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-dump_canada-d">dump() canada.json: speedup over 3.12.0 at each of 317 commits, ending at 3.3x. Labeled steps: #5285, #5634.</desc>
<desc id="nj-blog-tl-dump_canada-d">dump() canada.json: speedup over 3.12.0 at each of 317 commits, ending at 3.3x. Labeled steps, by theme: 6, 3.</desc>
<text class="nj-charts-panel" x="8" y="18">dump() canada.json</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="159.333" x2="330" y2="159.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="163.333">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="110.667" x2="330" y2="110.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="114.667">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">8&#215;</text>
<line class="nj-charts-grid" x1="44" y1="160.667" x2="330" y2="160.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="164.667">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="113.333" x2="330" y2="113.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="117.333">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">8&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.0 45.8,208.0 45.8,207.2 46.7,207.2 46.7,207.9 47.6,207.9 47.6,206.7 48.5,206.7 48.5,207.5 49.4,207.5 49.4,207.7 50.3,207.7 50.3,207.3 51.2,207.3 51.2,207.9 52.1,207.9 52.1,206.5 53.1,206.5 53.1,207.5 54.0,207.5 54.0,208.0 54.9,208.0 54.9,207.6 55.8,207.6 55.8,207.2 56.7,207.2 56.7,207.5 57.6,207.5 57.6,206.6 58.5,206.6 58.5,207.1 59.4,207.1 59.4,207.1 60.3,207.1 60.3,207.2 61.2,207.2 61.2,206.6 62.1,206.6 62.1,207.5 63.0,207.5 63.0,207.6 63.9,207.6 63.9,207.7 64.8,207.7 64.8,207.2 65.7,207.2 65.7,206.5 66.6,206.5 66.6,206.8 67.5,206.8 67.5,207.1 68.4,207.1 68.4,207.0 69.3,207.0 69.3,207.0 70.2,207.0 70.2,206.7 71.2,206.7 71.2,208.2 72.1,208.2 72.1,207.5 73.0,207.5 73.0,206.5 73.9,206.5 73.9,206.7 74.8,206.7 74.8,206.2 75.7,206.2 75.7,208.4 76.6,208.4 76.6,207.3 77.5,207.3 77.5,206.8 78.4,206.8 78.4,208.0 79.3,208.0 79.3,207.7 80.2,207.7 80.2,207.1 81.1,207.1 81.1,207.5 82.0,207.5 82.0,207.9 82.9,207.9 82.9,206.3 83.8,206.3 83.8,206.7 84.7,206.7 84.7,207.5 85.6,207.5 85.6,208.1 86.5,208.1 86.5,206.6 87.4,206.6 87.4,207.1 88.3,207.1 88.3,207.2 89.3,207.2 89.3,207.4 90.2,207.4 90.2,207.0 91.1,207.0 91.1,206.7 92.0,206.7 92.0,206.5 92.9,206.5 92.9,207.6 93.8,207.6 93.8,207.4 94.7,207.4 94.7,207.2 95.6,207.2 95.6,207.5 96.5,207.5 96.5,207.6 97.4,207.6 97.4,208.0 98.3,208.0 98.3,208.2 99.2,208.2 99.2,206.7 100.1,206.7 100.1,207.4 101.0,207.4 101.0,206.6 101.9,206.6 101.9,206.5 102.8,206.5 102.8,208.0 103.7,208.0 103.7,208.0 104.6,208.0 104.6,206.3 105.5,206.3 105.5,208.4 106.4,208.4 106.4,207.8 107.4,207.8 107.4,207.4 108.3,207.4 108.3,206.3 109.2,206.3 109.2,208.1 110.1,208.1 110.1,207.5 111.0,207.5 111.0,207.4 111.9,207.4 111.9,207.5 112.8,207.5 112.8,207.7 113.7,207.7 113.7,208.0 114.6,208.0 114.6,206.9 115.5,206.9 115.5,207.4 116.4,207.4 116.4,207.2 117.3,207.2 117.3,207.7 118.2,207.7 118.2,207.3 119.1,207.3 119.1,208.0 120.0,208.0 120.0,206.7 120.9,206.7 120.9,206.5 121.8,206.5 121.8,207.2 122.7,207.2 122.7,208.1 123.6,208.1 123.6,208.1 124.6,208.1 124.6,206.7 125.5,206.7 125.5,207.8 126.4,207.8 126.4,207.6 127.3,207.6 127.3,207.4 128.2,207.4 128.2,207.0 129.1,207.0 129.1,207.4 130.0,207.4 130.0,208.8 130.9,208.8 130.9,209.2 131.8,209.2 131.8,208.4 132.7,208.4 132.7,208.3 133.6,208.3 133.6,208.0 134.5,208.0 134.5,209.1 135.4,209.1 135.4,208.5 136.3,208.5 136.3,209.1 137.2,209.1 137.2,209.2 138.1,209.2 138.1,208.7 139.0,208.7 139.0,207.7 139.9,207.7 139.9,207.7 140.8,207.7 140.8,207.5 141.7,207.5 141.7,202.0 142.7,202.0 142.7,202.1 143.6,202.1 143.6,201.5 144.5,201.5 144.5,202.2 145.4,202.2 145.4,201.7 146.3,201.7 146.3,201.0 147.2,201.0 147.2,202.0 148.1,202.0 148.1,202.4 149.0,202.4 149.0,201.3 149.9,201.3 149.9,202.1 150.8,202.1 150.8,202.1 151.7,202.1 151.7,201.5 152.6,201.5 152.6,201.1 153.5,201.1 153.5,202.3 154.4,202.3 154.4,201.0 155.3,201.0 155.3,202.8 156.2,202.8 156.2,202.1 157.1,202.1 157.1,201.5 158.0,201.5 158.0,201.6 158.9,201.6 158.9,201.4 159.8,201.4 159.8,202.9 160.8,202.9 160.8,202.5 161.7,202.5 161.7,202.2 162.6,202.2 162.6,202.6 163.5,202.6 163.5,201.9 164.4,201.9 164.4,202.9 165.3,202.9 165.3,202.1 166.2,202.1 166.2,202.2 167.1,202.2 167.1,201.6 168.0,201.6 168.0,202.9 168.9,202.9 168.9,201.6 169.8,201.6 169.8,202.5 170.7,202.5 170.7,202.4 171.6,202.4 171.6,202.8 172.5,202.8 172.5,202.1 173.4,202.1 173.4,202.1 174.3,202.1 174.3,201.4 175.2,201.4 175.2,201.3 176.1,201.3 176.1,202.2 177.0,202.2 177.0,201.5 177.9,201.5 177.9,201.0 178.9,201.0 178.9,202.1 179.8,202.1 179.8,201.4 180.7,201.4 180.7,201.4 181.6,201.4 181.6,201.7 182.5,201.7 182.5,201.9 183.4,201.9 183.4,201.5 184.3,201.5 184.3,201.2 185.2,201.2 185.2,202.1 186.1,202.1 186.1,202.6 187.0,202.6 187.0,202.2 187.9,202.2 187.9,201.5 188.8,201.5 188.8,201.5 189.7,201.5 189.7,202.2 190.6,202.2 190.6,201.5 191.5,201.5 191.5,201.5 192.4,201.5 192.4,202.1 193.3,202.1 193.3,202.0 194.2,202.0 194.2,202.3 195.1,202.3 195.1,201.6 196.1,201.6 196.1,201.9 197.0,201.9 197.0,201.4 197.9,201.4 197.9,202.1 198.8,202.1 198.8,201.7 199.7,201.7 199.7,201.7 200.6,201.7 200.6,202.4 201.5,202.4 201.5,201.4 202.4,201.4 202.4,201.9 203.3,201.9 203.3,202.2 204.2,202.2 204.2,201.6 205.1,201.6 205.1,201.3 206.0,201.3 206.0,202.2 206.9,202.2 206.9,202.0 207.8,202.0 207.8,202.8 208.7,202.8 208.7,201.1 209.6,201.1 209.6,202.0 210.5,202.0 210.5,203.5 211.4,203.5 211.4,201.7 212.3,201.7 212.3,202.3 213.2,202.3 213.2,201.5 214.2,201.5 214.2,202.6 215.1,202.6 215.1,202.2 216.0,202.2 216.0,202.3 216.9,202.3 216.9,202.0 217.8,202.0 217.8,203.3 218.7,203.3 218.7,201.9 219.6,201.9 219.6,202.1 220.5,202.1 220.5,201.7 221.4,201.7 221.4,202.1 222.3,202.1 222.3,201.6 223.2,201.6 223.2,202.3 224.1,202.3 224.1,202.2 225.0,202.2 225.0,202.7 225.9,202.7 225.9,202.8 226.8,202.8 226.8,202.0 227.7,202.0 227.7,202.2 228.6,202.2 228.6,202.1 229.5,202.1 229.5,202.6 230.4,202.6 230.4,202.3 231.3,202.3 231.3,202.3 232.3,202.3 232.3,201.3 233.2,201.3 233.2,203.0 234.1,203.0 234.1,203.0 235.0,203.0 235.0,201.3 235.9Line truncated
<circle class="nj-charts-json-dot" cx="141.7" cy="202.0" r="3.5"><title>#5285: 1.09&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="141.7" y1="54.0" x2="141.7" y2="197.0"/>
<text class="nj-charts-note" x="141.7" y="50.0" text-anchor="middle">#5285</text>
<circle class="nj-charts-json-dot" cx="269.4" cy="128.5" r="3.5"><title>#5634: 3.1&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="269.4" y1="54.0" x2="269.4" y2="123.5"/>
<text class="nj-charts-note" x="269.4" y="50.0" text-anchor="middle">#5634</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.0 45.8,208.0 45.8,207.2 46.7,207.2 46.7,207.9 47.6,207.9 47.6,206.7 48.5,206.7 48.5,207.5 49.4,207.5 49.4,207.7 50.3,207.7 50.3,207.3 51.2,207.3 51.2,207.9 52.1,207.9 52.1,206.6 53.1,206.6 53.1,207.5 54.0,207.5 54.0,208.0 54.9,208.0 54.9,207.6 55.8,207.6 55.8,207.2 56.7,207.2 56.7,207.5 57.6,207.5 57.6,206.6 58.5,206.6 58.5,207.1 59.4,207.1 59.4,207.1 60.3,207.1 60.3,207.2 61.2,207.2 61.2,206.6 62.1,206.6 62.1,207.5 63.0,207.5 63.0,207.6 63.9,207.6 63.9,207.7 64.8,207.7 64.8,207.2 65.7,207.2 65.7,206.5 66.6,206.5 66.6,206.8 67.5,206.8 67.5,207.1 68.4,207.1 68.4,207.0 69.3,207.0 69.3,207.1 70.2,207.1 70.2,206.7 71.2,206.7 71.2,208.2 72.1,208.2 72.1,207.5 73.0,207.5 73.0,206.6 73.9,206.6 73.9,206.7 74.8,206.7 74.8,206.3 75.7,206.3 75.7,208.4 76.6,208.4 76.6,207.3 77.5,207.3 77.5,206.8 78.4,206.8 78.4,208.0 79.3,208.0 79.3,207.8 80.2,207.8 80.2,207.1 81.1,207.1 81.1,207.5 82.0,207.5 82.0,207.9 82.9,207.9 82.9,206.3 83.8,206.3 83.8,206.8 84.7,206.8 84.7,207.5 85.6,207.5 85.6,208.1 86.5,208.1 86.5,206.6 87.4,206.6 87.4,207.2 88.3,207.2 88.3,207.2 89.3,207.2 89.3,207.4 90.2,207.4 90.2,207.0 91.1,207.0 91.1,206.7 92.0,206.7 92.0,206.5 92.9,206.5 92.9,207.6 93.8,207.6 93.8,207.4 94.7,207.4 94.7,207.2 95.6,207.2 95.6,207.5 96.5,207.5 96.5,207.6 97.4,207.6 97.4,208.0 98.3,208.0 98.3,208.2 99.2,208.2 99.2,206.7 100.1,206.7 100.1,207.4 101.0,207.4 101.0,206.7 101.9,206.7 101.9,206.6 102.8,206.6 102.8,208.0 103.7,208.0 103.7,208.0 104.6,208.0 104.6,206.3 105.5,206.3 105.5,208.3 106.4,208.3 106.4,207.8 107.4,207.8 107.4,207.4 108.3,207.4 108.3,206.3 109.2,206.3 109.2,208.1 110.1,208.1 110.1,207.5 111.0,207.5 111.0,207.4 111.9,207.4 111.9,207.5 112.8,207.5 112.8,207.7 113.7,207.7 113.7,208.0 114.6,208.0 114.6,207.0 115.5,207.0 115.5,207.5 116.4,207.5 116.4,207.2 117.3,207.2 117.3,207.7 118.2,207.7 118.2,207.3 119.1,207.3 119.1,208.0 120.0,208.0 120.0,206.7 120.9,206.7 120.9,206.6 121.8,206.6 121.8,207.2 122.7,207.2 122.7,208.1 123.6,208.1 123.6,208.1 124.6,208.1 124.6,206.7 125.5,206.7 125.5,207.8 126.4,207.8 126.4,207.6 127.3,207.6 127.3,207.4 128.2,207.4 128.2,207.1 129.1,207.1 129.1,207.5 130.0,207.5 130.0,208.8 130.9,208.8 130.9,209.2 131.8,209.2 131.8,208.4 132.7,208.4 132.7,208.3 133.6,208.3 133.6,208.0 134.5,208.0 134.5,209.0 135.4,209.0 135.4,208.5 136.3,208.5 136.3,209.1 137.2,209.1 137.2,209.2 138.1,209.2 138.1,208.6 139.0,208.6 139.0,207.7 139.9,207.7 139.9,207.7 140.8,207.7 140.8,207.5 141.7,207.5 141.7,202.2 142.7,202.2 142.7,202.3 143.6,202.3 143.6,201.7 144.5,201.7 144.5,202.3 145.4,202.3 145.4,201.9 146.3,201.9 146.3,201.2 147.2,201.2 147.2,202.1 148.1,202.1 148.1,202.6 149.0,202.6 149.0,201.5 149.9,201.5 149.9,202.3 150.8,202.3 150.8,202.3 151.7,202.3 151.7,201.7 152.6,201.7 152.6,201.3 153.5,201.3 153.5,202.5 154.4,202.5 154.4,201.1 155.3,201.1 155.3,202.9 156.2,202.9 156.2,202.2 157.1,202.2 157.1,201.7 158.0,201.7 158.0,201.7 158.9,201.7 158.9,201.6 159.8,201.6 159.8,203.0 160.8,203.0 160.8,202.7 161.7,202.7 161.7,202.4 162.6,202.4 162.6,202.8 163.5,202.8 163.5,202.1 164.4,202.1 164.4,203.1 165.3,203.1 165.3,202.3 166.2,202.3 166.2,202.3 167.1,202.3 167.1,201.8 168.0,201.8 168.0,203.1 168.9,203.1 168.9,201.8 169.8,201.8 169.8,202.6 170.7,202.6 170.7,202.6 171.6,202.6 171.6,202.9 172.5,202.9 172.5,202.3 173.4,202.3 173.4,202.3 174.3,202.3 174.3,201.6 175.2,201.6 175.2,201.5 176.1,201.5 176.1,202.4 177.0,202.4 177.0,201.7 177.9,201.7 177.9,201.2 178.9,201.2 178.9,202.2 179.8,202.2 179.8,201.6 180.7,201.6 180.7,201.6 181.6,201.6 181.6,201.8 182.5,201.8 182.5,202.1 183.4,202.1 183.4,201.7 184.3,201.7 184.3,201.4 185.2,201.4 185.2,202.2 186.1,202.2 186.1,202.7 187.0,202.7 187.0,202.4 187.9,202.4 187.9,201.7 188.8,201.7 188.8,201.7 189.7,201.7 189.7,202.3 190.6,202.3 190.6,201.6 191.5,201.6 191.5,201.7 192.4,201.7 192.4,202.2 193.3,202.2 193.3,202.2 194.2,202.2 194.2,202.4 195.1,202.4 195.1,201.7 196.1,201.7 196.1,202.1 197.0,202.1 197.0,201.6 197.9,201.6 197.9,202.2 198.8,202.2 198.8,201.9 199.7,201.9 199.7,201.9 200.6,201.9 200.6,202.5 201.5,202.5 201.5,201.6 202.4,201.6 202.4,202.1 203.3,202.1 203.3,202.3 204.2,202.3 204.2,201.8 205.1,201.8 205.1,201.5 206.0,201.5 206.0,202.3 206.9,202.3 206.9,202.2 207.8,202.2 207.8,202.9 208.7,202.9 208.7,201.3 209.6,201.3 209.6,202.2 210.5,202.2 210.5,203.6 211.4,203.6 211.4,201.9 212.3,201.9 212.3,202.4 213.2,202.4 213.2,201.7 214.2,201.7 214.2,202.7 215.1,202.7 215.1,202.3 216.0,202.3 216.0,202.5 216.9,202.5 216.9,202.1 217.8,202.1 217.8,203.4 218.7,203.4 218.7,202.1 219.6,202.1 219.6,202.3 220.5,202.3 220.5,201.9 221.4,201.9 221.4,202.3 222.3,202.3 222.3,201.7 223.2,201.7 223.2,202.4 224.1,202.4 224.1,202.3 225.0,202.3 225.0,202.9 225.9,202.9 225.9,202.9 226.8,202.9 226.8,202.2 227.7,202.2 227.7,202.4 228.6,202.4 228.6,202.2 229.5,202.2 229.5,202.7 230.4,202.7 230.4,202.5 231.3,202.5 231.3,202.5 232.3,202.5 232.3,201.5 233.2,201.5 233.2,203.1 234.1,203.1 234.1,203.2 235.0,203.2 235.0,201.5 235.9Line truncated
<circle class="nj-charts-json-dot" cx="141.7" cy="202.2" r="3.5"><title>#5285: 1.09&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="141.7" y1="54.0" x2="141.7" y2="197.2"/>
<circle class="nj-theme-dot" cx="141.7" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="141.7" y="50.0" text-anchor="middle">6</text>
<circle class="nj-charts-json-dot" cx="269.4" cy="130.7" r="3.5"><title>#5634: 3.1&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="269.4" y1="54.0" x2="269.4" y2="125.7"/>
<circle class="nj-theme-dot" cx="269.4" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="269.4" y="50.0" text-anchor="middle">3</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

@@ -1,36 +1,40 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-dump_twitter nj-blog-tl-dump_twitter-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-dump_twitter">dump() twitter.json: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-dump_twitter-d">dump() twitter.json: speedup over 3.12.0 at each of 317 commits, ending at 6.7x. Labeled steps: #5285, #5738, #5878, #5883.</desc>
<desc id="nj-blog-tl-dump_twitter-d">dump() twitter.json: speedup over 3.12.0 at each of 317 commits, ending at 6.7x. Labeled steps, by theme: 6, 2, 2, 2.</desc>
<text class="nj-charts-panel" x="8" y="18">dump() twitter.json</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="171.5" x2="330" y2="171.5"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="175.5">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="135" x2="330" y2="135"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="139">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="98.5" x2="330" y2="98.5"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="102.5">8&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">16&#215;</text>
<line class="nj-charts-grid" x1="44" y1="172.5" x2="330" y2="172.5"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="176.5">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="137" x2="330" y2="137"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="141">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="101.5" x2="330" y2="101.5"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="105.5">8&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">16&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.0 45.8,208.0 45.8,207.2 46.7,207.2 46.7,207.9 47.6,207.9 47.6,206.8 48.5,206.8 48.5,208.0 49.4,208.0 49.4,207.4 50.3,207.4 50.3,207.3 51.2,207.3 51.2,208.0 52.1,208.0 52.1,206.8 53.1,206.8 53.1,207.1 54.0,207.1 54.0,208.0 54.9,208.0 54.9,207.2 55.8,207.2 55.8,207.5 56.7,207.5 56.7,206.8 57.6,206.8 57.6,206.8 58.5,206.8 58.5,207.5 59.4,207.5 59.4,207.3 60.3,207.3 60.3,207.8 61.2,207.8 61.2,206.8 62.1,206.8 62.1,207.8 63.0,207.8 63.0,207.3 63.9,207.3 63.9,208.0 64.8,208.0 64.8,207.4 65.7,207.4 65.7,207.3 66.6,207.3 66.6,206.9 67.5,206.9 67.5,207.2 68.4,207.2 68.4,207.4 69.3,207.4 69.3,207.6 70.2,207.6 70.2,207.5 71.2,207.5 71.2,207.6 72.1,207.6 72.1,207.4 73.0,207.4 73.0,207.2 73.9,207.2 73.9,207.1 74.8,207.1 74.8,207.3 75.7,207.3 75.7,207.7 76.6,207.7 76.6,207.8 77.5,207.8 77.5,206.8 78.4,206.8 78.4,207.6 79.3,207.6 79.3,207.0 80.2,207.0 80.2,206.9 81.1,206.9 81.1,207.3 82.0,207.3 82.0,207.5 82.9,207.5 82.9,206.8 83.8,206.8 83.8,207.7 84.7,207.7 84.7,207.4 85.6,207.4 85.6,207.4 86.5,207.4 86.5,207.1 87.4,207.1 87.4,207.3 88.3,207.3 88.3,207.5 89.3,207.5 89.3,207.3 90.2,207.3 90.2,207.3 91.1,207.3 91.1,206.8 92.0,206.8 92.0,207.4 92.9,207.4 92.9,207.9 93.8,207.9 93.8,207.3 94.7,207.3 94.7,206.7 95.6,206.7 95.6,207.6 96.5,207.6 96.5,207.7 97.4,207.7 97.4,208.7 98.3,208.7 98.3,208.6 99.2,208.6 99.2,208.6 100.1,208.6 100.1,209.2 101.0,209.2 101.0,208.5 101.9,208.5 101.9,208.2 102.8,208.2 102.8,209.3 103.7,209.3 103.7,208.4 104.6,208.4 104.6,208.4 105.5,208.4 105.5,209.0 106.4,209.0 106.4,209.1 107.4,209.1 107.4,208.7 108.3,208.7 108.3,208.9 109.2,208.9 109.2,208.7 110.1,208.7 110.1,209.0 111.0,209.0 111.0,208.8 111.9,208.8 111.9,208.7 112.8,208.7 112.8,209.3 113.7,209.3 113.7,208.7 114.6,208.7 114.6,208.5 115.5,208.5 115.5,208.5 116.4,208.5 116.4,208.0 117.3,208.0 117.3,208.9 118.2,208.9 118.2,208.7 119.1,208.7 119.1,209.0 120.0,209.0 120.0,208.1 120.9,208.1 120.9,208.0 121.8,208.0 121.8,208.6 122.7,208.6 122.7,208.5 123.6,208.5 123.6,209.2 124.6,209.2 124.6,208.0 125.5,208.0 125.5,209.1 126.4,209.1 126.4,209.0 127.3,209.0 127.3,208.5 128.2,208.5 128.2,209.1 129.1,209.1 129.1,209.0 130.0,209.0 130.0,208.9 130.9,208.9 130.9,208.6 131.8,208.6 131.8,208.7 132.7,208.7 132.7,208.2 133.6,208.2 133.6,209.1 134.5,209.1 134.5,209.3 135.4,209.3 135.4,209.1 136.3,209.1 136.3,209.2 137.2,209.2 137.2,209.3 138.1,209.3 138.1,208.5 139.0,208.5 139.0,208.8 139.9,208.8 139.9,209.5 140.8,209.5 140.8,208.4 141.7,208.4 141.7,145.7 142.7,145.7 142.7,146.6 143.6,146.6 143.6,146.7 144.5,146.7 144.5,145.8 145.4,145.8 145.4,145.8 146.3,145.8 146.3,146.0 147.2,146.0 147.2,146.5 148.1,146.5 148.1,146.5 149.0,146.5 149.0,145.6 149.9,145.6 149.9,146.4 150.8,146.4 150.8,145.5 151.7,145.5 151.7,145.8 152.6,145.8 152.6,145.6 153.5,145.6 153.5,146.7 154.4,146.7 154.4,145.7 155.3,145.7 155.3,146.6 156.2,146.6 156.2,146.8 157.1,146.8 157.1,146.0 158.0,146.0 158.0,146.1 158.9,146.1 158.9,146.4 159.8,146.4 159.8,146.9 160.8,146.9 160.8,146.3 161.7,146.3 161.7,146.4 162.6,146.4 162.6,146.5 163.5,146.5 163.5,146.6 164.4,146.6 164.4,147.3 165.3,147.3 165.3,147.0 166.2,147.0 166.2,146.5 167.1,146.5 167.1,146.4 168.0,146.4 168.0,147.3 168.9,147.3 168.9,146.0 169.8,146.0 169.8,147.5 170.7,147.5 170.7,147.4 171.6,147.4 171.6,147.1 172.5,147.1 172.5,146.4 173.4,146.4 173.4,147.0 174.3,147.0 174.3,146.0 175.2,146.0 175.2,146.2 176.1,146.2 176.1,146.0 177.0,146.0 177.0,146.6 177.9,146.6 177.9,146.4 178.9,146.4 178.9,146.5 179.8,146.5 179.8,146.7 180.7,146.7 180.7,146.6 181.6,146.6 181.6,146.4 182.5,146.4 182.5,147.3 183.4,147.3 183.4,146.1 184.3,146.1 184.3,147.2 185.2,147.2 185.2,146.6 186.1,146.6 186.1,146.3 187.0,146.3 187.0,146.1 187.9,146.1 187.9,146.3 188.8,146.3 188.8,146.0 189.7,146.0 189.7,146.5 190.6,146.5 190.6,145.3 191.5,145.3 191.5,146.2 192.4,146.2 192.4,146.2 193.3,146.2 193.3,146.2 194.2,146.2 194.2,146.0 195.1,146.0 195.1,146.3 196.1,146.3 196.1,145.7 197.0,145.7 197.0,145.8 197.9,145.8 197.9,145.8 198.8,145.8 198.8,145.3 199.7,145.3 199.7,145.3 200.6,145.3 200.6,146.6 201.5,146.6 201.5,146.0 202.4,146.0 202.4,146.3 203.3,146.3 203.3,146.5 204.2,146.5 204.2,146.0 205.1,146.0 205.1,146.1 206.0,146.1 206.0,146.6 206.9,146.6 206.9,146.6 207.8,146.6 207.8,146.8 208.7,146.8 208.7,146.4 209.6,146.4 209.6,146.2 210.5,146.2 210.5,146.5 211.4,146.5 211.4,145.8 212.3,145.8 212.3,146.4 213.2,146.4 213.2,145.9 214.2,145.9 214.2,146.7 215.1,146.7 215.1,146.5 216.0,146.5 216.0,146.6 216.9,146.6 216.9,147.0 217.8,147.0 217.8,147.7 218.7,147.7 218.7,147.0 219.6,147.0 219.6,147.8 220.5,147.8 220.5,146.5 221.4,146.5 221.4,146.8 222.3,146.8 222.3,147.4 223.2,147.4 223.2,147.1 224.1,147.1 224.1,147.5 225.0,147.5 225.0,147.7 225.9,147.7 225.9,147.5 226.8,147.5 226.8,146.9 227.7,146.9 227.7,147.2 228.6,147.2 228.6,146.9 229.5,146.9 229.5,147.2 230.4,147.2 230.4,147.3 231.3,147.3 231.3,147.3 232.3,147.3 232.3,146.8 233.2,146.8 233.2,147.5 234.1,147.5 234.1,147.5 235.0,147.5 235.0,146.6 235.9Line truncated
<circle class="nj-charts-json-dot" cx="141.7" cy="145.7" r="3.5"><title>#5285: 3.3&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="141.7" y1="54.0" x2="141.7" y2="140.7"/>
<text class="nj-charts-note" x="141.7" y="50.0" text-anchor="middle">#5285</text>
<circle class="nj-charts-json-dot" cx="268.5" cy="137.1" r="3.5"><title>#5738: 3.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="268.5" y1="54.0" x2="268.5" y2="132.1"/>
<text class="nj-charts-note" x="268.5" y="50.0" text-anchor="middle">#5738</text>
<circle class="nj-charts-json-dot" cx="301.9" cy="128.8" r="3.5"><title>#5878: 4.5&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="301.9" y1="41.0" x2="301.9" y2="123.8"/>
<text class="nj-charts-note" x="301.9" y="37.0" text-anchor="middle">#5878</text>
<circle class="nj-charts-json-dot" cx="308.3" cy="106.8" r="3.5"><title>#5883: 6.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="308.3" y1="28.0" x2="308.3" y2="101.8"/>
<text class="nj-charts-note" x="308.3" y="24.0" text-anchor="middle">#5883</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.0 45.8,208.0 45.8,207.2 46.7,207.2 46.7,207.9 47.6,207.9 47.6,206.8 48.5,206.8 48.5,208.0 49.4,208.0 49.4,207.4 50.3,207.4 50.3,207.3 51.2,207.3 51.2,208.0 52.1,208.0 52.1,206.8 53.1,206.8 53.1,207.2 54.0,207.2 54.0,208.0 54.9,208.0 54.9,207.2 55.8,207.2 55.8,207.5 56.7,207.5 56.7,206.8 57.6,206.8 57.6,206.9 58.5,206.9 58.5,207.5 59.4,207.5 59.4,207.3 60.3,207.3 60.3,207.8 61.2,207.8 61.2,206.8 62.1,206.8 62.1,207.8 63.0,207.8 63.0,207.4 63.9,207.4 63.9,208.0 64.8,208.0 64.8,207.4 65.7,207.4 65.7,207.3 66.6,207.3 66.6,206.9 67.5,206.9 67.5,207.3 68.4,207.3 68.4,207.4 69.3,207.4 69.3,207.6 70.2,207.6 70.2,207.5 71.2,207.5 71.2,207.6 72.1,207.6 72.1,207.4 73.0,207.4 73.0,207.2 73.9,207.2 73.9,207.1 74.8,207.1 74.8,207.3 75.7,207.3 75.7,207.7 76.6,207.7 76.6,207.8 77.5,207.8 77.5,206.9 78.4,206.9 78.4,207.6 79.3,207.6 79.3,207.0 80.2,207.0 80.2,207.0 81.1,207.0 81.1,207.3 82.0,207.3 82.0,207.6 82.9,207.6 82.9,206.8 83.8,206.8 83.8,207.7 84.7,207.7 84.7,207.4 85.6,207.4 85.6,207.5 86.5,207.5 86.5,207.1 87.4,207.1 87.4,207.3 88.3,207.3 88.3,207.5 89.3,207.5 89.3,207.3 90.2,207.3 90.2,207.3 91.1,207.3 91.1,206.9 92.0,206.9 92.0,207.4 92.9,207.4 92.9,207.9 93.8,207.9 93.8,207.3 94.7,207.3 94.7,206.8 95.6,206.8 95.6,207.6 96.5,207.6 96.5,207.7 97.4,207.7 97.4,208.6 98.3,208.6 98.3,208.5 99.2,208.5 99.2,208.6 100.1,208.6 100.1,209.2 101.0,209.2 101.0,208.5 101.9,208.5 101.9,208.2 102.8,208.2 102.8,209.3 103.7,209.3 103.7,208.4 104.6,208.4 104.6,208.4 105.5,208.4 105.5,209.0 106.4,209.0 106.4,209.0 107.4,209.0 107.4,208.7 108.3,208.7 108.3,208.9 109.2,208.9 109.2,208.7 110.1,208.7 110.1,209.0 111.0,209.0 111.0,208.8 111.9,208.8 111.9,208.7 112.8,208.7 112.8,209.3 113.7,209.3 113.7,208.6 114.6,208.6 114.6,208.5 115.5,208.5 115.5,208.4 116.4,208.4 116.4,208.0 117.3,208.0 117.3,208.9 118.2,208.9 118.2,208.6 119.1,208.6 119.1,208.9 120.0,208.9 120.0,208.1 120.9,208.1 120.9,208.0 121.8,208.0 121.8,208.6 122.7,208.6 122.7,208.5 123.6,208.5 123.6,209.1 124.6,209.1 124.6,208.0 125.5,208.0 125.5,209.1 126.4,209.1 126.4,208.9 127.3,208.9 127.3,208.5 128.2,208.5 128.2,209.1 129.1,209.1 129.1,209.0 130.0,209.0 130.0,208.8 130.9,208.8 130.9,208.6 131.8,208.6 131.8,208.6 132.7,208.6 132.7,208.2 133.6,208.2 133.6,209.0 134.5,209.0 134.5,209.2 135.4,209.2 135.4,209.1 136.3,209.1 136.3,209.2 137.2,209.2 137.2,209.2 138.1,209.2 138.1,208.5 139.0,208.5 139.0,208.7 139.9,208.7 139.9,209.5 140.8,209.5 140.8,208.4 141.7,208.4 141.7,147.4 142.7,147.4 142.7,148.3 143.6,148.3 143.6,148.4 144.5,148.4 144.5,147.5 145.4,147.5 145.4,147.5 146.3,147.5 146.3,147.7 147.2,147.7 147.2,148.2 148.1,148.2 148.1,148.2 149.0,148.2 149.0,147.3 149.9,147.3 149.9,148.1 150.8,148.1 150.8,147.2 151.7,147.2 151.7,147.5 152.6,147.5 152.6,147.3 153.5,147.3 153.5,148.4 154.4,148.4 154.4,147.4 155.3,147.4 155.3,148.3 156.2,148.3 156.2,148.5 157.1,148.5 157.1,147.7 158.0,147.7 158.0,147.8 158.9,147.8 158.9,148.0 159.8,148.0 159.8,148.5 160.8,148.5 160.8,148.0 161.7,148.0 161.7,148.1 162.6,148.1 162.6,148.2 163.5,148.2 163.5,148.3 164.4,148.3 164.4,149.0 165.3,149.0 165.3,148.7 166.2,148.7 166.2,148.2 167.1,148.2 167.1,148.1 168.0,148.1 168.0,148.9 168.9,148.9 168.9,147.7 169.8,147.7 169.8,149.2 170.7,149.2 170.7,149.1 171.6,149.1 171.6,148.8 172.5,148.8 172.5,148.1 173.4,148.1 173.4,148.7 174.3,148.7 174.3,147.7 175.2,147.7 175.2,147.9 176.1,147.9 176.1,147.7 177.0,147.7 177.0,148.3 177.9,148.3 177.9,148.0 178.9,148.0 178.9,148.2 179.8,148.2 179.8,148.4 180.7,148.4 180.7,148.3 181.6,148.3 181.6,148.1 182.5,148.1 182.5,149.0 183.4,149.0 183.4,147.8 184.3,147.8 184.3,148.8 185.2,148.8 185.2,148.3 186.1,148.3 186.1,148.0 187.0,148.0 187.0,147.8 187.9,147.8 187.9,148.0 188.8,148.0 188.8,147.7 189.7,147.7 189.7,148.2 190.6,148.2 190.6,147.1 191.5,147.1 191.5,147.9 192.4,147.9 192.4,147.9 193.3,147.9 193.3,147.9 194.2,147.9 194.2,147.7 195.1,147.7 195.1,148.0 196.1,148.0 196.1,147.4 197.0,147.4 197.0,147.5 197.9,147.5 197.9,147.5 198.8,147.5 198.8,147.0 199.7,147.0 199.7,147.0 200.6,147.0 200.6,148.2 201.5,148.2 201.5,147.7 202.4,147.7 202.4,148.0 203.3,148.0 203.3,148.2 204.2,148.2 204.2,147.7 205.1,147.7 205.1,147.8 206.0,147.8 206.0,148.2 206.9,148.2 206.9,148.3 207.8,148.3 207.8,148.5 208.7,148.5 208.7,148.1 209.6,148.1 209.6,147.9 210.5,147.9 210.5,148.2 211.4,148.2 211.4,147.5 212.3,147.5 212.3,148.1 213.2,148.1 213.2,147.6 214.2,147.6 214.2,148.4 215.1,148.4 215.1,148.2 216.0,148.2 216.0,148.3 216.9,148.3 216.9,148.7 217.8,148.7 217.8,149.4 218.7,149.4 218.7,148.7 219.6,148.7 219.6,149.5 220.5,149.5 220.5,148.2 221.4,148.2 221.4,148.5 222.3,148.5 222.3,149.1 223.2,149.1 223.2,148.8 224.1,148.8 224.1,149.2 225.0,149.2 225.0,149.3 225.9,149.3 225.9,149.1 226.8,149.1 226.8,148.6 227.7,148.6 227.7,148.9 228.6,148.9 228.6,148.5 229.5,148.5 229.5,148.9 230.4,148.9 230.4,149.0 231.3,149.0 231.3,149.0 232.3,149.0 232.3,148.5 233.2,148.5 233.2,149.1 234.1,149.1 234.1,149.2 235.0,149.2 235.0,148.3 235.9Line truncated
<circle class="nj-charts-json-dot" cx="141.7" cy="147.4" r="3.5"><title>#5285: 3.3&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="141.7" y1="54.0" x2="141.7" y2="142.4"/>
<circle class="nj-theme-dot" cx="141.7" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="141.7" y="50.0" text-anchor="middle">6</text>
<circle class="nj-charts-json-dot" cx="268.5" cy="139.0" r="3.5"><title>#5738: 3.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="268.5" y1="54.0" x2="268.5" y2="134.0"/>
<circle class="nj-theme-dot" cx="268.5" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="268.5" y="50.0" text-anchor="middle">2</text>
<circle class="nj-charts-json-dot" cx="301.9" cy="131.0" r="3.5"><title>#5878: 4.5&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="301.9" y1="54.0" x2="301.9" y2="126.0"/>
<circle class="nj-theme-dot" cx="301.9" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="301.9" y="50.0" text-anchor="middle">2</text>
<circle class="nj-charts-json-dot" cx="308.3" cy="109.6" r="3.5"><title>#5883: 6.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="308.3" y1="36.0" x2="308.3" y2="104.6"/>
<circle class="nj-theme-dot" cx="308.3" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="308.3" y="32.0" text-anchor="middle">2</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

@@ -1,32 +1,36 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-from_cbor_twitter nj-blog-tl-from_cbor_twitter-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-from_cbor_twitter">from_cbor() twitter: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-from_cbor_twitter-d">from_cbor() twitter: speedup over 3.12.0 at each of 317 commits, ending at 2.6x. Labeled steps: #5233, #5501, #5185, #5746.</desc>
<desc id="nj-blog-tl-from_cbor_twitter-d">from_cbor() twitter: speedup over 3.12.0 at each of 317 commits, ending at 2.6x. Labeled steps, by theme: 1, 4, U, U.</desc>
<text class="nj-charts-panel" x="8" y="18">from_cbor() twitter</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="135" x2="330" y2="135"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="139">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="137" x2="330" y2="137"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="141">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">4&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,209.1 45.8,209.1 45.8,208.2 46.7,208.2 46.7,208.6 47.6,208.6 47.6,208.0 48.5,208.0 48.5,208.5 49.4,208.5 49.4,208.6 50.3,208.6 50.3,208.3 51.2,208.3 51.2,209.1 52.1,209.1 52.1,207.8 53.1,207.8 53.1,208.5 54.0,208.5 54.0,208.6 54.9,208.6 54.9,208.7 55.8,208.7 55.8,207.7 56.7,207.7 56.7,207.1 57.6,207.1 57.6,207.3 58.5,207.3 58.5,206.9 59.4,206.9 59.4,207.1 60.3,207.1 60.3,207.0 61.2,207.0 61.2,207.1 62.1,207.1 62.1,207.1 63.0,207.1 63.0,207.5 63.9,207.5 63.9,207.5 64.8,207.5 64.8,206.8 65.7,206.8 65.7,206.9 66.6,206.9 66.6,206.2 67.5,206.2 67.5,207.1 68.4,207.1 68.4,208.5 69.3,208.5 69.3,208.0 70.2,208.0 70.2,207.7 71.2,207.7 71.2,208.5 72.1,208.5 72.1,207.8 73.0,207.8 73.0,207.0 73.9,207.0 73.9,208.1 74.8,208.1 74.8,208.2 75.7,208.2 75.7,208.7 76.6,208.7 76.6,208.1 77.5,208.1 77.5,207.2 78.4,207.2 78.4,208.3 79.3,208.3 79.3,207.4 80.2,207.4 80.2,207.9 81.1,207.9 81.1,207.7 82.0,207.7 82.0,208.7 82.9,208.7 82.9,207.3 83.8,207.3 83.8,207.9 84.7,207.9 84.7,208.4 85.6,208.4 85.6,208.5 86.5,208.5 86.5,208.0 87.4,208.0 87.4,207.0 88.3,207.0 88.3,208.1 89.3,208.1 89.3,208.1 90.2,208.1 90.2,207.8 91.1,207.8 91.1,207.9 92.0,207.9 92.0,207.9 92.9,207.9 92.9,208.7 93.8,208.7 93.8,208.1 94.7,208.1 94.7,167.8 95.6,167.8 95.6,169.3 96.5,169.3 96.5,168.9 97.4,168.9 97.4,167.9 98.3,167.9 98.3,168.6 99.2,168.6 99.2,168.0 100.1,168.0 100.1,169.0 101.0,169.0 101.0,167.7 101.9,167.7 101.9,166.7 102.8,166.7 102.8,169.3 103.7,169.3 103.7,168.4 104.6,168.4 104.6,168.6 105.5,168.6 105.5,171.9 106.4,171.9 106.4,169.4 107.4,169.4 107.4,169.3 108.3,169.3 108.3,169.1 109.2,169.1 109.2,169.2 110.1,169.2 110.1,169.7 111.0,169.7 111.0,169.4 111.9,169.4 111.9,169.3 112.8,169.3 112.8,170.1 113.7,170.1 113.7,169.2 114.6,169.2 114.6,167.5 115.5,167.5 115.5,167.8 116.4,167.8 116.4,167.7 117.3,167.7 117.3,169.4 118.2,169.4 118.2,168.1 119.1,168.1 119.1,168.7 120.0,168.7 120.0,167.1 120.9,167.1 120.9,167.2 121.8,167.2 121.8,168.8 122.7,168.8 122.7,169.2 123.6,169.2 123.6,169.4 124.6,169.4 124.6,168.1 125.5,168.1 125.5,169.4 126.4,169.4 126.4,169.0 127.3,169.0 127.3,168.9 128.2,168.9 128.2,168.9 129.1,168.9 129.1,168.6 130.0,168.6 130.0,168.9 130.9,168.9 130.9,168.1 131.8,168.1 131.8,168.5 132.7,168.5 132.7,168.9 133.6,168.9 133.6,168.9 134.5,168.9 134.5,169.4 135.4,169.4 135.4,169.7 136.3,169.7 136.3,169.4 137.2,169.4 137.2,169.7 138.1,169.7 138.1,168.1 139.0,168.1 139.0,126.4 139.9,126.4 139.9,118.6 140.8,118.6 140.8,118.0 141.7,118.0 141.7,118.3 142.7,118.3 142.7,118.5 143.6,118.5 143.6,117.8 144.5,117.8 144.5,113.9 145.4,113.9 145.4,114.9 146.3,114.9 146.3,114.8 147.2,114.8 147.2,115.4 148.1,115.4 148.1,115.8 149.0,115.8 149.0,115.5 149.9,115.5 149.9,117.6 150.8,117.6 150.8,116.4 151.7,116.4 151.7,117.1 152.6,117.1 152.6,116.5 153.5,116.5 153.5,118.5 154.4,118.5 154.4,116.0 155.3,116.0 155.3,118.7 156.2,118.7 156.2,117.6 157.1,117.6 157.1,115.9 158.0,115.9 158.0,116.8 158.9,116.8 158.9,116.5 159.8,116.5 159.8,117.7 160.8,117.7 160.8,116.5 161.7,116.5 161.7,116.9 162.6,116.9 162.6,117.3 163.5,117.3 163.5,117.9 164.4,117.9 164.4,118.2 165.3,118.2 165.3,117.1 166.2,117.1 166.2,116.3 167.1,116.3 167.1,115.9 168.0,115.9 168.0,117.7 168.9,117.7 168.9,116.9 169.8,116.9 169.8,117.4 170.7,117.4 170.7,117.2 171.6,117.2 171.6,117.3 172.5,117.3 172.5,116.7 173.4,116.7 173.4,117.0 174.3,117.0 174.3,115.5 175.2,115.5 175.2,148.6 176.1,148.6 176.1,148.9 177.0,148.9 177.0,149.0 177.9,149.0 177.9,149.7 178.9,149.7 178.9,149.8 179.8,149.8 179.8,149.1 180.7,149.1 180.7,150.6 181.6,150.6 181.6,150.2 182.5,150.2 182.5,150.9 183.4,150.9 183.4,149.0 184.3,149.0 184.3,151.3 185.2,151.3 185.2,152.7 186.1,152.7 186.1,151.3 187.0,151.3 187.0,151.3 187.9,151.3 187.9,152.0 188.8,152.0 188.8,150.1 189.7,150.1 189.7,152.3 190.6,152.3 190.6,150.0 191.5,150.0 191.5,151.0 192.4,151.0 192.4,152.0 193.3,152.0 193.3,150.2 194.2,150.2 194.2,151.2 195.1,151.2 195.1,152.1 196.1,152.1 196.1,151.2 197.0,151.2 197.0,150.9 197.9,150.9 197.9,151.2 198.8,151.2 198.8,150.0 199.7,150.0 199.7,151.6 200.6,151.6 200.6,153.1 201.5,153.1 201.5,150.5 202.4,150.5 202.4,151.4 203.3,151.4 203.3,152.4 204.2,152.4 204.2,151.5 205.1,151.5 205.1,151.1 206.0,151.1 206.0,152.5 206.9,152.5 206.9,152.5 207.8,152.5 207.8,152.8 208.7,152.8 208.7,151.0 209.6,151.0 209.6,152.8 210.5,152.8 210.5,152.6 211.4,152.6 211.4,150.3 212.3,150.3 212.3,152.5 213.2,152.5 213.2,151.5 214.2,151.5 214.2,150.7 215.1,150.7 215.1,152.2 216.0,152.2 216.0,152.3 216.9,152.3 216.9,152.4 217.8,152.4 217.8,154.0 218.7,154.0 218.7,151.8 219.6,151.8 219.6,153.9 220.5,153.9 220.5,151.2 221.4,151.2 221.4,152.5 222.3,152.5 222.3,150.7 223.2,150.7 223.2,151.6 224.1,151.6 224.1,151.9 225.0,151.9 225.0,152.1 225.9,152.1 225.9,153.1 226.8,153.1 226.8,151.2 227.7,151.2 227.7,153.9 228.6,153.9 228.6,151.0 229.5,151.0 229.5,151.8 230.4,151.8 230.4,151.7 231.3,151.7 231.3,153.0 232.3,153.0 232.3,151.0 233.2,151.0 233.2,151.5 234.1,151.5 234.1,152.8 235.0,152.8 235.0,119.6 235.9Line truncated
<circle class="nj-charts-json-dot" cx="94.7" cy="167.8" r="3.5"><title>#5233: 1.47&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="94.7" y1="54.0" x2="94.7" y2="162.8"/>
<text class="nj-charts-note" x="94.7" y="50.0" text-anchor="middle">#5233</text>
<circle class="nj-charts-json-dot" cx="139.0" cy="126.4" r="3.5"><title>#5501: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.0" y1="54.0" x2="139.0" y2="121.4"/>
<text class="nj-charts-note" x="139.0" y="50.0" text-anchor="middle">#5501</text>
<circle class="nj-charts-json-dot" cx="175.2" cy="148.6" r="3.5"><title>#5185: 1.76&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="175.2" y1="41.0" x2="175.2" y2="143.6"/>
<text class="nj-charts-note" x="175.2" y="37.0" text-anchor="middle">#5185</text>
<circle class="nj-charts-json-dot" cx="235.0" cy="119.6" r="3.5"><title>#5746: 2.3&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="235.0" y1="54.0" x2="235.0" y2="114.6"/>
<text class="nj-charts-note" x="235.0" y="50.0" text-anchor="middle">#5746</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,209.1 45.8,209.1 45.8,208.2 46.7,208.2 46.7,208.6 47.6,208.6 47.6,208.0 48.5,208.0 48.5,208.4 49.4,208.4 49.4,208.6 50.3,208.6 50.3,208.3 51.2,208.3 51.2,209.1 52.1,209.1 52.1,207.8 53.1,207.8 53.1,208.5 54.0,208.5 54.0,208.6 54.9,208.6 54.9,208.6 55.8,208.6 55.8,207.7 56.7,207.7 56.7,207.1 57.6,207.1 57.6,207.3 58.5,207.3 58.5,206.9 59.4,206.9 59.4,207.1 60.3,207.1 60.3,207.0 61.2,207.0 61.2,207.1 62.1,207.1 62.1,207.1 63.0,207.1 63.0,207.5 63.9,207.5 63.9,207.5 64.8,207.5 64.8,206.9 65.7,206.9 65.7,207.0 66.6,207.0 66.6,206.2 67.5,206.2 67.5,207.1 68.4,207.1 68.4,208.5 69.3,208.5 69.3,208.0 70.2,208.0 70.2,207.8 71.2,207.8 71.2,208.5 72.1,208.5 72.1,207.8 73.0,207.8 73.0,207.0 73.9,207.0 73.9,208.1 74.8,208.1 74.8,208.2 75.7,208.2 75.7,208.6 76.6,208.6 76.6,208.1 77.5,208.1 77.5,207.2 78.4,207.2 78.4,208.3 79.3,208.3 79.3,207.4 80.2,207.4 80.2,207.9 81.1,207.9 81.1,207.7 82.0,207.7 82.0,208.6 82.9,208.6 82.9,207.3 83.8,207.3 83.8,207.9 84.7,207.9 84.7,208.4 85.6,208.4 85.6,208.5 86.5,208.5 86.5,208.0 87.4,208.0 87.4,207.1 88.3,207.1 88.3,208.1 89.3,208.1 89.3,208.1 90.2,208.1 90.2,207.8 91.1,207.8 91.1,207.9 92.0,207.9 92.0,207.9 92.9,207.9 92.9,208.7 93.8,208.7 93.8,208.1 94.7,208.1 94.7,168.9 95.6,168.9 95.6,170.3 96.5,170.3 96.5,169.9 97.4,169.9 97.4,169.0 98.3,169.0 98.3,169.6 99.2,169.6 99.2,169.1 100.1,169.1 100.1,170.1 101.0,170.1 101.0,168.8 101.9,168.8 101.9,167.9 102.8,167.9 102.8,170.4 103.7,170.4 103.7,169.5 104.6,169.5 104.6,169.7 105.5,169.7 105.5,172.9 106.4,172.9 106.4,170.5 107.4,170.5 107.4,170.4 108.3,170.4 108.3,170.1 109.2,170.1 109.2,170.2 110.1,170.2 110.1,170.7 111.0,170.7 111.0,170.5 111.9,170.5 111.9,170.4 112.8,170.4 112.8,171.1 113.7,171.1 113.7,170.2 114.6,170.2 114.6,168.6 115.5,168.6 115.5,168.9 116.4,168.9 116.4,168.8 117.3,168.8 117.3,170.5 118.2,170.5 118.2,169.2 119.1,169.2 119.1,169.8 120.0,169.8 120.0,168.2 120.9,168.2 120.9,168.3 121.8,168.3 121.8,169.9 122.7,169.9 122.7,170.3 123.6,170.3 123.6,170.5 124.6,170.5 124.6,169.2 125.5,169.2 125.5,170.5 126.4,170.5 126.4,170.1 127.3,170.1 127.3,170.0 128.2,170.0 128.2,170.0 129.1,170.0 129.1,169.7 130.0,169.7 130.0,169.9 130.9,169.9 130.9,169.2 131.8,169.2 131.8,169.6 132.7,169.6 132.7,170.0 133.6,170.0 133.6,170.0 134.5,170.0 134.5,170.5 135.4,170.5 135.4,170.8 136.3,170.8 136.3,170.5 137.2,170.5 137.2,170.8 138.1,170.8 138.1,169.2 139.0,169.2 139.0,128.6 139.9,128.6 139.9,121.0 140.8,121.0 140.8,120.5 141.7,120.5 141.7,120.8 142.7,120.8 142.7,120.9 143.6,120.9 143.6,120.2 144.5,120.2 144.5,116.5 145.4,116.5 145.4,117.5 146.3,117.5 146.3,117.4 147.2,117.4 147.2,118.0 148.1,118.0 148.1,118.3 149.0,118.3 149.0,118.0 149.9,118.0 149.9,120.1 150.8,120.1 150.8,118.9 151.7,118.9 151.7,119.6 152.6,119.6 152.6,119.0 153.5,119.0 153.5,120.9 154.4,120.9 154.4,118.6 155.3,118.6 155.3,121.1 156.2,121.1 156.2,120.1 157.1,120.1 157.1,118.4 158.0,118.4 158.0,119.3 158.9,119.3 158.9,119.0 159.8,119.0 159.8,120.2 160.8,120.2 160.8,119.0 161.7,119.0 161.7,119.4 162.6,119.4 162.6,119.8 163.5,119.8 163.5,120.4 164.4,120.4 164.4,120.6 165.3,120.6 165.3,119.6 166.2,119.6 166.2,118.8 167.1,118.8 167.1,118.4 168.0,118.4 168.0,120.2 168.9,120.2 168.9,119.3 169.8,119.3 169.8,119.9 170.7,119.9 170.7,119.6 171.6,119.6 171.6,119.7 172.5,119.7 172.5,119.2 173.4,119.2 173.4,119.5 174.3,119.5 174.3,118.0 175.2,118.0 175.2,150.3 176.1,150.3 176.1,150.5 177.0,150.5 177.0,150.6 177.9,150.6 177.9,151.3 178.9,151.3 178.9,151.4 179.8,151.4 179.8,150.7 180.7,150.7 180.7,152.1 181.6,152.1 181.6,151.8 182.5,151.8 182.5,152.4 183.4,152.4 183.4,150.6 184.3,150.6 184.3,152.8 185.2,152.8 185.2,154.2 186.1,154.2 186.1,152.8 187.0,152.8 187.0,152.9 187.9,152.9 187.9,153.6 188.8,153.6 188.8,151.7 189.7,151.7 189.7,153.8 190.6,153.8 190.6,151.6 191.5,151.6 191.5,152.6 192.4,152.6 192.4,153.5 193.3,153.5 193.3,151.8 194.2,151.8 194.2,152.7 195.1,152.7 195.1,153.6 196.1,153.6 196.1,152.7 197.0,152.7 197.0,152.5 197.9,152.5 197.9,152.7 198.8,152.7 198.8,151.6 199.7,151.6 199.7,153.2 200.6,153.2 200.6,154.6 201.5,154.6 201.5,152.1 202.4,152.1 202.4,152.9 203.3,152.9 203.3,153.9 204.2,153.9 204.2,153.0 205.1,153.0 205.1,152.6 206.0,152.6 206.0,154.0 206.9,154.0 206.9,154.0 207.8,154.0 207.8,154.3 208.7,154.3 208.7,152.5 209.6,152.5 209.6,154.4 210.5,154.4 210.5,154.2 211.4,154.2 211.4,151.8 212.3,151.8 212.3,154.0 213.2,154.0 213.2,153.0 214.2,153.0 214.2,152.2 215.1,152.2 215.1,153.7 216.0,153.7 216.0,153.8 216.9,153.8 216.9,153.9 217.8,153.9 217.8,155.5 218.7,155.5 218.7,153.4 219.6,153.4 219.6,155.4 220.5,155.4 220.5,152.8 221.4,152.8 221.4,154.0 222.3,154.0 222.3,152.3 223.2,152.3 223.2,153.2 224.1,153.2 224.1,153.5 225.0,153.5 225.0,153.6 225.9,153.6 225.9,154.6 226.8,154.6 226.8,152.7 227.7,152.7 227.7,155.4 228.6,155.4 228.6,152.5 229.5,152.5 229.5,153.3 230.4,153.3 230.4,153.3 231.3,153.3 231.3,154.5 232.3,154.5 232.3,152.6 233.2,152.6 233.2,153.0 234.1,153.0 234.1,154.3 235.0,154.3 235.0,122.0 235.9Line truncated
<circle class="nj-charts-json-dot" cx="94.7" cy="168.9" r="3.5"><title>#5233: 1.47&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="94.7" y1="54.0" x2="94.7" y2="163.9"/>
<circle class="nj-theme-dot" cx="94.7" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="94.7" y="50.0" text-anchor="middle">1</text>
<circle class="nj-charts-json-dot" cx="139.0" cy="128.6" r="3.5"><title>#5501: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.0" y1="54.0" x2="139.0" y2="123.6"/>
<circle class="nj-theme-dot" cx="139.0" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="139.0" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="175.2" cy="150.3" r="3.5"><title>#5185: 1.76&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="175.2" y1="54.0" x2="175.2" y2="145.3"/>
<circle class="nj-theme-dot nj-theme-dot--other" cx="175.2" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="175.2" y="50.0" text-anchor="middle">U</text>
<circle class="nj-charts-json-dot" cx="235.0" cy="122.0" r="3.5"><title>#5746: 2.3&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="235.0" y1="54.0" x2="235.0" y2="117.0"/>
<circle class="nj-theme-dot nj-theme-dot--other" cx="235.0" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="235.0" y="50.0" text-anchor="middle">U</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

@@ -1,38 +1,44 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-parse_canada nj-blog-tl-parse_canada-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-parse_canada">parse() canada.json: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-parse_canada-d">parse() canada.json: speedup over 3.12.0 at each of 317 commits, ending at 2.8x. Labeled steps: #5234, #5283, #5617, #5738, #5851, #5882.</desc>
<desc id="nj-blog-tl-parse_canada-d">parse() canada.json: speedup over 3.12.0 at each of 317 commits, ending at 2.8x. Labeled steps, by theme: 4, 1, 3, 3, 3, 4.</desc>
<text class="nj-charts-panel" x="8" y="18">parse() canada.json</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="135" x2="330" y2="135"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="139">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="137" x2="330" y2="137"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="141">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">4&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.2 45.8,208.2 45.8,208.1 46.7,208.1 46.7,207.7 47.6,207.7 47.6,207.2 48.5,207.2 48.5,208.0 49.4,208.0 49.4,208.2 50.3,208.2 50.3,207.8 51.2,207.8 51.2,208.5 52.1,208.5 52.1,207.3 53.1,207.3 53.1,208.0 54.0,208.0 54.0,209.2 54.9,209.2 54.9,208.5 55.8,208.5 55.8,208.1 56.7,208.1 56.7,207.7 57.6,207.7 57.6,209.8 58.5,209.8 58.5,208.6 59.4,208.6 59.4,208.1 60.3,208.1 60.3,208.1 61.2,208.1 61.2,207.0 62.1,207.0 62.1,207.8 63.0,207.8 63.0,207.6 63.9,207.6 63.9,208.1 64.8,208.1 64.8,208.4 65.7,208.4 65.7,207.7 66.6,207.7 66.6,207.4 67.5,207.4 67.5,208.3 68.4,208.3 68.4,207.3 69.3,207.3 69.3,207.8 70.2,207.8 70.2,207.9 71.2,207.9 71.2,207.9 72.1,207.9 72.1,207.4 73.0,207.4 73.0,207.5 73.9,207.5 73.9,208.1 74.8,208.1 74.8,208.1 75.7,208.1 75.7,207.9 76.6,207.9 76.6,207.8 77.5,207.8 77.5,207.0 78.4,207.0 78.4,207.6 79.3,207.6 79.3,207.8 80.2,207.8 80.2,207.3 81.1,207.3 81.1,207.6 82.0,207.6 82.0,208.6 82.9,208.6 82.9,206.5 83.8,206.5 83.8,208.0 84.7,208.0 84.7,208.7 85.6,208.7 85.6,208.0 86.5,208.0 86.5,207.7 87.4,207.7 87.4,208.4 88.3,208.4 88.3,207.9 89.3,207.9 89.3,207.5 90.2,207.5 90.2,207.9 91.1,207.9 91.1,207.4 92.0,207.4 92.0,207.5 92.9,207.5 92.9,208.5 93.8,208.5 93.8,197.2 94.7,197.2 94.7,197.7 95.6,197.7 95.6,196.5 96.5,196.5 96.5,196.7 97.4,196.7 97.4,197.5 98.3,197.5 98.3,195.7 99.2,195.7 99.2,197.0 100.1,197.0 100.1,197.8 101.0,197.8 101.0,197.1 101.9,197.1 101.9,196.7 102.8,196.7 102.8,197.2 103.7,197.2 103.7,197.0 104.6,197.0 104.6,197.4 105.5,197.4 105.5,197.4 106.4,197.4 106.4,197.3 107.4,197.3 107.4,196.6 108.3,196.6 108.3,197.6 109.2,197.6 109.2,197.6 110.1,197.6 110.1,197.3 111.0,197.3 111.0,197.3 111.9,197.3 111.9,197.3 112.8,197.3 112.8,197.8 113.7,197.8 113.7,197.7 114.6,197.7 114.6,195.0 115.5,195.0 115.5,196.3 116.4,196.3 116.4,197.6 117.3,197.6 117.3,196.7 118.2,196.7 118.2,196.0 119.1,196.0 119.1,196.5 120.0,196.5 120.0,196.2 120.9,196.2 120.9,196.3 121.8,196.3 121.8,197.4 122.7,197.4 122.7,197.3 123.6,197.3 123.6,197.8 124.6,197.8 124.6,195.5 125.5,195.5 125.5,197.2 126.4,197.2 126.4,197.3 127.3,197.3 127.3,196.4 128.2,196.4 128.2,196.7 129.1,196.7 129.1,197.7 130.0,197.7 130.0,196.7 130.9,196.7 130.9,196.9 131.8,196.9 131.8,196.3 132.7,196.3 132.7,196.7 133.6,196.7 133.6,196.9 134.5,196.9 134.5,197.3 135.4,197.3 135.4,197.5 136.3,197.5 136.3,196.9 137.2,196.9 137.2,197.3 138.1,197.3 138.1,197.0 139.0,197.0 139.0,196.7 139.9,196.7 139.9,167.5 140.8,167.5 140.8,168.6 141.7,168.6 141.7,169.1 142.7,169.1 142.7,167.8 143.6,167.8 143.6,167.2 144.5,167.2 144.5,168.9 145.4,168.9 145.4,167.6 146.3,167.6 146.3,167.2 147.2,167.2 147.2,168.6 148.1,168.6 148.1,169.8 149.0,169.8 149.0,167.0 149.9,167.0 149.9,169.1 150.8,169.1 150.8,168.0 151.7,168.0 151.7,169.0 152.6,169.0 152.6,167.3 153.5,167.3 153.5,168.7 154.4,168.7 154.4,169.0 155.3,169.0 155.3,168.7 156.2,168.7 156.2,168.0 157.1,168.0 157.1,166.0 158.0,166.0 158.0,168.7 158.9,168.7 158.9,167.5 159.8,167.5 159.8,169.2 160.8,169.2 160.8,168.7 161.7,168.7 161.7,167.6 162.6,167.6 162.6,168.2 163.5,168.2 163.5,171.3 164.4,171.3 164.4,170.2 165.3,170.2 165.3,168.0 166.2,168.0 166.2,166.7 167.1,166.7 167.1,168.2 168.0,168.2 168.0,168.0 168.9,168.0 168.9,167.4 169.8,167.4 169.8,167.6 170.7,167.6 170.7,167.5 171.6,167.5 171.6,167.9 172.5,167.9 172.5,167.4 173.4,167.4 173.4,169.8 174.3,169.8 174.3,168.8 175.2,168.8 175.2,166.9 176.1,166.9 176.1,167.7 177.0,167.7 177.0,167.4 177.9,167.4 177.9,167.3 178.9,167.3 178.9,168.8 179.8,168.8 179.8,168.0 180.7,168.0 180.7,167.4 181.6,167.4 181.6,167.5 182.5,167.5 182.5,168.3 183.4,168.3 183.4,168.0 184.3,168.0 184.3,169.1 185.2,169.1 185.2,177.1 186.1,177.1 186.1,176.5 187.0,176.5 187.0,166.6 187.9,166.6 187.9,167.4 188.8,167.4 188.8,167.6 189.7,167.6 189.7,167.4 190.6,167.4 190.6,167.7 191.5,167.7 191.5,166.9 192.4,166.9 192.4,167.1 193.3,167.1 193.3,166.5 194.2,166.5 194.2,166.3 195.1,166.3 195.1,167.0 196.1,167.0 196.1,167.2 197.0,167.2 197.0,167.0 197.9,167.0 197.9,167.0 198.8,167.0 198.8,166.4 199.7,166.4 199.7,165.4 200.6,165.4 200.6,168.1 201.5,168.1 201.5,167.5 202.4,167.5 202.4,167.3 203.3,167.3 203.3,167.0 204.2,167.0 204.2,166.2 205.1,166.2 205.1,166.8 206.0,166.8 206.0,167.1 206.9,167.1 206.9,167.4 207.8,167.4 207.8,167.9 208.7,167.9 208.7,165.4 209.6,165.4 209.6,168.3 210.5,168.3 210.5,168.2 211.4,168.2 211.4,166.1 212.3,166.1 212.3,167.4 213.2,167.4 213.2,166.0 214.2,166.0 214.2,168.3 215.1,168.3 215.1,167.8 216.0,167.8 216.0,166.3 216.9,166.3 216.9,167.3 217.8,167.3 217.8,167.3 218.7,167.3 218.7,165.8 219.6,165.8 219.6,167.6 220.5,167.6 220.5,164.5 221.4,164.5 221.4,165.8 222.3,165.8 222.3,165.4 223.2,165.4 223.2,166.3 224.1,166.3 224.1,166.5 225.0,166.5 225.0,166.0 225.9,166.0 225.9,166.2 226.8,166.2 226.8,165.4 227.7,165.4 227.7,165.0 228.6,165.0 228.6,167.3 229.5,167.3 229.5,166.0 230.4,166.0 230.4,165.5 231.3,165.5 231.3,165.3 232.3,165.3 232.3,164.9 233.2,164.9 233.2,166.2 234.1,166.2 234.1,166.1 235.0,166.1 235.0,166.1 235.9Line truncated
<circle class="nj-charts-json-dot" cx="93.8" cy="197.2" r="3.5"><title>#5234: 1.11&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="93.8" y1="54.0" x2="93.8" y2="192.2"/>
<text class="nj-charts-note" x="93.8" y="50.0" text-anchor="middle">#5234</text>
<circle class="nj-charts-json-dot" cx="139.9" cy="167.5" r="3.5"><title>#5283: 1.47&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.9" y1="54.0" x2="139.9" y2="162.5"/>
<text class="nj-charts-note" x="139.9" y="50.0" text-anchor="middle">#5283</text>
<circle class="nj-charts-json-dot" cx="187.0" cy="166.6" r="3.5"><title>#5617: 1.48&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="187.0" y1="54.0" x2="187.0" y2="161.6"/>
<text class="nj-charts-note" x="187.0" y="50.0" text-anchor="middle">#5617</text>
<circle class="nj-charts-json-dot" cx="268.5" cy="137.9" r="3.5"><title>#5738: 1.95&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="268.5" y1="54.0" x2="268.5" y2="132.9"/>
<text class="nj-charts-note" x="268.5" y="50.0" text-anchor="middle">#5738</text>
<circle class="nj-charts-json-dot" cx="297.4" cy="125.1" r="3.5"><title>#5851: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="297.4" y1="41.0" x2="297.4" y2="120.1"/>
<text class="nj-charts-note" x="297.4" y="37.0" text-anchor="middle">#5851</text>
<circle class="nj-charts-json-dot" cx="312.8" cy="99.2" r="3.5"><title>#5882: 2.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="312.8" y1="54.0" x2="312.8" y2="94.2"/>
<text class="nj-charts-note" x="312.0" y="50.0" text-anchor="middle">#5882</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.2 45.8,208.2 45.8,208.1 46.7,208.1 46.7,207.7 47.6,207.7 47.6,207.2 48.5,207.2 48.5,208.0 49.4,208.0 49.4,208.2 50.3,208.2 50.3,207.8 51.2,207.8 51.2,208.5 52.1,208.5 52.1,207.3 53.1,207.3 53.1,208.0 54.0,208.0 54.0,209.1 54.9,209.1 54.9,208.5 55.8,208.5 55.8,208.1 56.7,208.1 56.7,207.7 57.6,207.7 57.6,209.8 58.5,209.8 58.5,208.6 59.4,208.6 59.4,208.1 60.3,208.1 60.3,208.1 61.2,208.1 61.2,207.0 62.1,207.0 62.1,207.8 63.0,207.8 63.0,207.6 63.9,207.6 63.9,208.1 64.8,208.1 64.8,208.4 65.7,208.4 65.7,207.8 66.6,207.8 66.6,207.4 67.5,207.4 67.5,208.3 68.4,208.3 68.4,207.3 69.3,207.3 69.3,207.8 70.2,207.8 70.2,207.9 71.2,207.9 71.2,207.9 72.1,207.9 72.1,207.5 73.0,207.5 73.0,207.5 73.9,207.5 73.9,208.1 74.8,208.1 74.8,208.1 75.7,208.1 75.7,207.9 76.6,207.9 76.6,207.8 77.5,207.8 77.5,207.1 78.4,207.1 78.4,207.6 79.3,207.6 79.3,207.8 80.2,207.8 80.2,207.3 81.1,207.3 81.1,207.6 82.0,207.6 82.0,208.6 82.9,208.6 82.9,206.5 83.8,206.5 83.8,208.0 84.7,208.0 84.7,208.7 85.6,208.7 85.6,208.0 86.5,208.0 86.5,207.7 87.4,207.7 87.4,208.4 88.3,208.4 88.3,207.9 89.3,207.9 89.3,207.5 90.2,207.5 90.2,207.9 91.1,207.9 91.1,207.4 92.0,207.4 92.0,207.5 92.9,207.5 92.9,208.5 93.8,208.5 93.8,197.5 94.7,197.5 94.7,197.9 95.6,197.9 95.6,196.9 96.5,196.9 96.5,197.0 97.4,197.0 97.4,197.7 98.3,197.7 98.3,196.0 99.2,196.0 99.2,197.3 100.1,197.3 100.1,198.1 101.0,198.1 101.0,197.4 101.9,197.4 101.9,197.0 102.8,197.0 102.8,197.5 103.7,197.5 103.7,197.3 104.6,197.3 104.6,197.7 105.5,197.7 105.5,197.7 106.4,197.7 106.4,197.6 107.4,197.6 107.4,196.9 108.3,196.9 108.3,197.9 109.2,197.9 109.2,197.9 110.1,197.9 110.1,197.6 111.0,197.6 111.0,197.6 111.9,197.6 111.9,197.6 112.8,197.6 112.8,198.1 113.7,198.1 113.7,198.0 114.6,198.0 114.6,195.3 115.5,195.3 115.5,196.6 116.4,196.6 116.4,197.9 117.3,197.9 117.3,197.0 118.2,197.0 118.2,196.3 119.1,196.3 119.1,196.8 120.0,196.8 120.0,196.6 120.9,196.6 120.9,196.6 121.8,196.6 121.8,197.7 122.7,197.7 122.7,197.5 123.6,197.5 123.6,198.1 124.6,198.1 124.6,195.9 125.5,195.9 125.5,197.5 126.4,197.5 126.4,197.6 127.3,197.6 127.3,196.7 128.2,196.7 128.2,197.0 129.1,197.0 129.1,198.0 130.0,198.0 130.0,197.0 130.9,197.0 130.9,197.2 131.8,197.2 131.8,196.6 132.7,196.6 132.7,197.0 133.6,197.0 133.6,197.2 134.5,197.2 134.5,197.6 135.4,197.6 135.4,197.8 136.3,197.8 136.3,197.2 137.2,197.2 137.2,197.6 138.1,197.6 138.1,197.3 139.0,197.3 139.0,197.0 139.9,197.0 139.9,168.6 140.8,168.6 140.8,169.7 141.7,169.7 141.7,170.1 142.7,170.1 142.7,168.9 143.6,168.9 143.6,168.3 144.5,168.3 144.5,169.9 145.4,169.9 145.4,168.7 146.3,168.7 146.3,168.3 147.2,168.3 147.2,169.7 148.1,169.7 148.1,170.9 149.0,170.9 149.0,168.1 149.9,168.1 149.9,170.2 150.8,170.2 150.8,169.1 151.7,169.1 151.7,170.1 152.6,170.1 152.6,168.5 153.5,168.5 153.5,169.7 154.4,169.7 154.4,170.1 155.3,170.1 155.3,169.8 156.2,169.8 156.2,169.1 157.1,169.1 157.1,167.2 158.0,167.2 158.0,169.7 158.9,169.7 158.9,168.6 159.8,168.6 159.8,170.3 160.8,170.3 160.8,169.7 161.7,169.7 161.7,168.7 162.6,168.7 162.6,169.3 163.5,169.3 163.5,172.3 164.4,172.3 164.4,171.2 165.3,171.2 165.3,169.1 166.2,169.1 166.2,167.8 167.1,167.8 167.1,169.3 168.0,169.3 168.0,169.1 168.9,169.1 168.9,168.5 169.8,168.5 169.8,168.7 170.7,168.7 170.7,168.6 171.6,168.6 171.6,169.0 172.5,169.0 172.5,168.5 173.4,168.5 173.4,170.9 174.3,170.9 174.3,169.9 175.2,169.9 175.2,168.0 176.1,168.0 176.1,168.8 177.0,168.8 177.0,168.5 177.9,168.5 177.9,168.5 178.9,168.5 178.9,169.9 179.8,169.9 179.8,169.1 180.7,169.1 180.7,168.6 181.6,168.6 181.6,168.6 182.5,168.6 182.5,169.4 183.4,169.4 183.4,169.1 184.3,169.1 184.3,170.2 185.2,170.2 185.2,178.0 186.1,178.0 186.1,177.3 187.0,177.3 187.0,167.7 187.9,167.7 187.9,168.5 188.8,168.5 188.8,168.7 189.7,168.7 189.7,168.5 190.6,168.5 190.6,168.8 191.5,168.8 191.5,168.0 192.4,168.0 192.4,168.2 193.3,168.2 193.3,167.7 194.2,167.7 194.2,167.5 195.1,167.5 195.1,168.1 196.1,168.1 196.1,168.3 197.0,168.3 197.0,168.1 197.9,168.1 197.9,168.1 198.8,168.1 198.8,167.5 199.7,167.5 199.7,166.5 200.6,166.5 200.6,169.1 201.5,169.1 201.5,168.6 202.4,168.6 202.4,168.5 203.3,168.5 203.3,168.1 204.2,168.1 204.2,167.3 205.1,167.3 205.1,168.0 206.0,168.0 206.0,168.3 206.9,168.3 206.9,168.6 207.8,168.6 207.8,169.0 208.7,169.0 208.7,166.6 209.6,166.6 209.6,169.4 210.5,169.4 210.5,169.3 211.4,169.3 211.4,167.3 212.3,167.3 212.3,168.5 213.2,168.5 213.2,167.1 214.2,167.1 214.2,169.4 215.1,169.4 215.1,168.9 216.0,168.9 216.0,167.4 216.9,167.4 216.9,168.4 217.8,168.4 217.8,168.5 218.7,168.5 218.7,166.9 219.6,166.9 219.6,168.7 220.5,168.7 220.5,165.7 221.4,165.7 221.4,167.0 222.3,167.0 222.3,166.6 223.2,166.6 223.2,167.4 224.1,167.4 224.1,167.6 225.0,167.6 225.0,167.2 225.9,167.2 225.9,167.4 226.8,167.4 226.8,166.6 227.7,166.6 227.7,166.2 228.6,166.2 228.6,168.4 229.5,168.4 229.5,167.2 230.4,167.2 230.4,166.7 231.3,166.7 231.3,166.5 232.3,166.5 232.3,166.0 233.2,166.0 233.2,167.4 234.1,167.4 234.1,167.3 235.0,167.3 235.0,167.3 235.9Line truncated
<circle class="nj-charts-json-dot" cx="93.8" cy="197.5" r="3.5"><title>#5234: 1.11&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="93.8" y1="54.0" x2="93.8" y2="192.5"/>
<circle class="nj-theme-dot" cx="93.8" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="93.8" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="139.9" cy="168.6" r="3.5"><title>#5283: 1.47&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.9" y1="54.0" x2="139.9" y2="163.6"/>
<circle class="nj-theme-dot" cx="139.9" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="139.9" y="50.0" text-anchor="middle">1</text>
<circle class="nj-charts-json-dot" cx="187.0" cy="167.7" r="3.5"><title>#5617: 1.48&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="187.0" y1="54.0" x2="187.0" y2="162.7"/>
<circle class="nj-theme-dot" cx="187.0" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="187.0" y="50.0" text-anchor="middle">3</text>
<circle class="nj-charts-json-dot" cx="268.5" cy="139.8" r="3.5"><title>#5738: 1.95&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="268.5" y1="54.0" x2="268.5" y2="134.8"/>
<circle class="nj-theme-dot" cx="268.5" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="268.5" y="50.0" text-anchor="middle">3</text>
<circle class="nj-charts-json-dot" cx="297.4" cy="127.4" r="3.5"><title>#5851: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="297.4" y1="54.0" x2="297.4" y2="122.4"/>
<circle class="nj-theme-dot" cx="297.4" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="297.4" y="50.0" text-anchor="middle">3</text>
<circle class="nj-charts-json-dot" cx="312.8" cy="102.2" r="3.5"><title>#5882: 2.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="312.8" y1="36.0" x2="312.8" y2="97.2"/>
<circle class="nj-theme-dot" cx="312.8" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="312.8" y="32.0" text-anchor="middle">4</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@@ -1,38 +1,45 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-parse_citm nj-blog-tl-parse_citm-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-parse_citm">parse() citm_catalog.json: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-parse_citm-d">parse() citm_catalog.json: speedup over 3.12.0 at each of 317 commits, ending at 3.3x. Labeled steps: #5234, #5283, #5592, #5809, #5810, #5882.</desc>
<desc id="nj-blog-tl-parse_citm-d">parse() citm_catalog.json: speedup over 3.12.0 at each of 317 commits, ending at 3.3x. Labeled steps, by theme: 4, 1, 4, 4, 2, 4.</desc>
<text class="nj-charts-panel" x="8" y="18">parse() citm_catalog.json</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="159.333" x2="330" y2="159.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="163.333">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="110.667" x2="330" y2="110.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="114.667">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">8&#215;</text>
<line class="nj-charts-grid" x1="44" y1="160.667" x2="330" y2="160.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="164.667">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="113.333" x2="330" y2="113.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="117.333">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">8&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.2 45.8,208.2 45.8,207.8 46.7,207.8 46.7,207.5 47.6,207.5 47.6,206.4 48.5,206.4 48.5,208.3 49.4,208.3 49.4,207.3 50.3,207.3 50.3,206.8 51.2,206.8 51.2,207.8 52.1,207.8 52.1,206.8 53.1,206.8 53.1,207.3 54.0,207.3 54.0,207.6 54.9,207.6 54.9,207.8 55.8,207.8 55.8,207.0 56.7,207.0 56.7,207.2 57.6,207.2 57.6,207.2 58.5,207.2 58.5,207.3 59.4,207.3 59.4,207.5 60.3,207.5 60.3,207.4 61.2,207.4 61.2,206.5 62.1,206.5 62.1,207.6 63.0,207.6 63.0,207.6 63.9,207.6 63.9,207.1 64.8,207.1 64.8,207.0 65.7,207.0 65.7,207.6 66.6,207.6 66.6,206.6 67.5,206.6 67.5,207.3 68.4,207.3 68.4,206.8 69.3,206.8 69.3,207.3 70.2,207.3 70.2,207.7 71.2,207.7 71.2,207.9 72.1,207.9 72.1,207.2 73.0,207.2 73.0,206.4 73.9,206.4 73.9,207.6 74.8,207.6 74.8,206.4 75.7,206.4 75.7,208.0 76.6,208.0 76.6,207.4 77.5,207.4 77.5,206.4 78.4,206.4 78.4,207.5 79.3,207.5 79.3,207.1 80.2,207.1 80.2,206.9 81.1,206.9 81.1,207.6 82.0,207.6 82.0,207.6 82.9,207.6 82.9,207.0 83.8,207.0 83.8,206.8 84.7,206.8 84.7,208.0 85.6,208.0 85.6,207.6 86.5,207.6 86.5,206.6 87.4,206.6 87.4,206.7 88.3,206.7 88.3,207.3 89.3,207.3 89.3,206.9 90.2,206.9 90.2,207.6 91.1,207.6 91.1,207.1 92.0,207.1 92.0,207.6 92.9,207.6 92.9,207.9 93.8,207.9 93.8,177.3 94.7,177.3 94.7,176.7 95.6,176.7 95.6,176.9 96.5,176.9 96.5,176.8 97.4,176.8 97.4,176.8 98.3,176.8 98.3,176.2 99.2,176.2 99.2,176.0 100.1,176.0 100.1,176.8 101.0,176.8 101.0,176.7 101.9,176.7 101.9,175.9 102.8,175.9 102.8,177.0 103.7,177.0 103.7,176.1 104.6,176.1 104.6,175.9 105.5,175.9 105.5,177.2 106.4,177.2 106.4,177.2 107.4,177.2 107.4,176.7 108.3,176.7 108.3,176.8 109.2,176.8 109.2,176.6 110.1,176.6 110.1,176.8 111.0,176.8 111.0,177.0 111.9,177.0 111.9,176.7 112.8,176.7 112.8,177.1 113.7,177.1 113.7,176.8 114.6,176.8 114.6,175.0 115.5,175.0 115.5,176.6 116.4,176.6 116.4,176.7 117.3,176.7 117.3,176.8 118.2,176.8 118.2,176.0 119.1,176.0 119.1,176.6 120.0,176.6 120.0,176.5 120.9,176.5 120.9,176.5 121.8,176.5 121.8,176.0 122.7,176.0 122.7,177.1 123.6,177.1 123.6,176.4 124.6,176.4 124.6,175.7 125.5,175.7 125.5,176.6 126.4,176.6 126.4,176.6 127.3,176.6 127.3,176.6 128.2,176.6 128.2,176.6 129.1,176.6 129.1,176.2 130.0,176.2 130.0,176.9 130.9,176.9 130.9,175.3 131.8,175.3 131.8,176.1 132.7,176.1 132.7,176.6 133.6,176.6 133.6,176.9 134.5,176.9 134.5,176.9 135.4,176.9 135.4,177.0 136.3,177.0 136.3,176.4 137.2,176.4 137.2,176.6 138.1,176.6 138.1,176.6 139.0,176.6 139.0,176.3 139.9,176.3 139.9,161.2 140.8,161.2 140.8,160.9 141.7,160.9 141.7,160.4 142.7,160.4 142.7,160.9 143.6,160.9 143.6,159.8 144.5,159.8 144.5,159.4 145.4,159.4 145.4,158.0 146.3,158.0 146.3,158.9 147.2,158.9 147.2,159.0 148.1,159.0 148.1,159.3 149.0,159.3 149.0,158.1 149.9,158.1 149.9,159.1 150.8,159.1 150.8,158.2 151.7,158.2 151.7,158.6 152.6,158.6 152.6,158.5 153.5,158.5 153.5,158.8 154.4,158.8 154.4,158.3 155.3,158.3 155.3,159.4 156.2,159.4 156.2,158.8 157.1,158.8 157.1,157.7 158.0,157.7 158.0,158.4 158.9,158.4 158.9,158.5 159.8,158.5 159.8,159.2 160.8,159.2 160.8,158.9 161.7,158.9 161.7,158.6 162.6,158.6 162.6,159.1 163.5,159.1 163.5,159.2 164.4,159.2 164.4,159.2 165.3,159.2 165.3,158.3 166.2,158.3 166.2,158.2 167.1,158.2 167.1,158.7 168.0,158.7 168.0,158.9 168.9,158.9 168.9,158.7 169.8,158.7 169.8,159.2 170.7,159.2 170.7,158.5 171.6,158.5 171.6,158.9 172.5,158.9 172.5,158.7 173.4,158.7 173.4,159.5 174.3,159.5 174.3,157.8 175.2,157.8 175.2,158.3 176.1,158.3 176.1,157.8 177.0,157.8 177.0,158.6 177.9,158.6 177.9,158.0 178.9,158.0 178.9,158.3 179.8,158.3 179.8,158.1 180.7,158.1 180.7,158.7 181.6,158.7 181.6,157.7 182.5,157.7 182.5,158.0 183.4,158.0 183.4,158.9 184.3,158.9 184.3,160.0 185.2,160.0 185.2,160.4 186.1,160.4 186.1,160.3 187.0,160.3 187.0,158.9 187.9,158.9 187.9,159.7 188.8,159.7 188.8,159.9 189.7,159.9 189.7,160.4 190.6,160.4 190.6,159.8 191.5,159.8 191.5,159.1 192.4,159.1 192.4,160.3 193.3,160.3 193.3,159.3 194.2,159.3 194.2,160.1 195.1,160.1 195.1,160.0 196.1,160.0 196.1,160.0 197.0,160.0 197.0,160.4 197.9,160.4 197.9,159.9 198.8,159.9 198.8,158.7 199.7,158.7 199.7,159.6 200.6,159.6 200.6,160.2 201.5,160.2 201.5,159.3 202.4,159.3 202.4,160.6 203.3,160.6 203.3,160.1 204.2,160.1 204.2,158.7 205.1,158.7 205.1,159.2 206.0,159.2 206.0,160.7 206.9,160.7 206.9,160.2 207.8,160.2 207.8,160.7 208.7,160.7 208.7,160.0 209.6,160.0 209.6,161.1 210.5,161.1 210.5,160.8 211.4,160.8 211.4,159.5 212.3,159.5 212.3,160.2 213.2,160.2 213.2,160.1 214.2,160.1 214.2,161.0 215.1,161.0 215.1,160.1 216.0,160.1 216.0,160.1 216.9,160.1 216.9,160.5 217.8,160.5 217.8,159.4 218.7,159.4 218.7,159.2 219.6,159.2 219.6,159.1 220.5,159.1 220.5,157.9 221.4,157.9 221.4,158.1 222.3,158.1 222.3,159.0 223.2,159.0 223.2,158.7 224.1,158.7 224.1,159.0 225.0,159.0 225.0,159.1 225.9,159.1 225.9,159.5 226.8,159.5 226.8,158.5 227.7,158.5 227.7,158.0 228.6,158.0 228.6,159.2 229.5,159.2 229.5,158.8 230.4,158.8 230.4,159.4 231.3,159.4 231.3,159.3 232.3,159.3 232.3,158.1 233.2,158.1 233.2,159.7 234.1,159.7 234.1,160.0 235.0,160.0 235.0,159.7 235.9Line truncated
<circle class="nj-charts-json-dot" cx="93.8" cy="177.3" r="3.5"><title>#5234: 1.55&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="93.8" y1="54.0" x2="93.8" y2="172.3"/>
<text class="nj-charts-note" x="93.8" y="50.0" text-anchor="middle">#5234</text>
<circle class="nj-charts-json-dot" cx="139.9" cy="161.2" r="3.5"><title>#5283: 1.95&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.9" y1="54.0" x2="139.9" y2="156.2"/>
<text class="nj-charts-note" x="139.9" y="50.0" text-anchor="middle">#5283</text>
<circle class="nj-charts-json-dot" cx="243.1" cy="153.9" r="3.5"><title>#5592: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="243.1" y1="54.0" x2="243.1" y2="148.9"/>
<text class="nj-charts-note" x="243.1" y="50.0" text-anchor="middle">#5592</text>
<circle class="nj-charts-json-dot" cx="265.7" cy="145.4" r="3.5"><title>#5809: 2.4&#215;</title></circle>
<circle class="nj-charts-json-dot" cx="266.6" cy="136.3" r="3.5"><title>#5810: 2.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="266.6" y1="41.0" x2="266.6" y2="131.3"/>
<text class="nj-charts-note" x="266.6" y="37.0" text-anchor="middle">#5809, #5810</text>
<circle class="nj-charts-json-dot" cx="312.8" cy="123.3" r="3.5"><title>#5882: 3.3&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="312.8" y1="54.0" x2="312.8" y2="118.3"/>
<text class="nj-charts-note" x="312.0" y="50.0" text-anchor="middle">#5882</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.2 45.8,208.2 45.8,207.8 46.7,207.8 46.7,207.5 47.6,207.5 47.6,206.5 48.5,206.5 48.5,208.3 49.4,208.3 49.4,207.3 50.3,207.3 50.3,206.8 51.2,206.8 51.2,207.8 52.1,207.8 52.1,206.8 53.1,206.8 53.1,207.3 54.0,207.3 54.0,207.6 54.9,207.6 54.9,207.8 55.8,207.8 55.8,207.0 56.7,207.0 56.7,207.3 57.6,207.3 57.6,207.2 58.5,207.2 58.5,207.4 59.4,207.4 59.4,207.5 60.3,207.5 60.3,207.4 61.2,207.4 61.2,206.6 62.1,206.6 62.1,207.6 63.0,207.6 63.0,207.6 63.9,207.6 63.9,207.2 64.8,207.2 64.8,207.0 65.7,207.0 65.7,207.6 66.6,207.6 66.6,206.7 67.5,206.7 67.5,207.4 68.4,207.4 68.4,206.8 69.3,206.8 69.3,207.3 70.2,207.3 70.2,207.7 71.2,207.7 71.2,207.9 72.1,207.9 72.1,207.2 73.0,207.2 73.0,206.4 73.9,206.4 73.9,207.6 74.8,207.6 74.8,206.4 75.7,206.4 75.7,208.0 76.6,208.0 76.6,207.4 77.5,207.4 77.5,206.5 78.4,206.5 78.4,207.5 79.3,207.5 79.3,207.2 80.2,207.2 80.2,206.9 81.1,206.9 81.1,207.6 82.0,207.6 82.0,207.6 82.9,207.6 82.9,207.0 83.8,207.0 83.8,206.9 84.7,206.9 84.7,208.0 85.6,208.0 85.6,207.6 86.5,207.6 86.5,206.6 87.4,206.6 87.4,206.8 88.3,206.8 88.3,207.3 89.3,207.3 89.3,206.9 90.2,206.9 90.2,207.6 91.1,207.6 91.1,207.1 92.0,207.1 92.0,207.6 92.9,207.6 92.9,207.9 93.8,207.9 93.8,178.2 94.7,178.2 94.7,177.5 95.6,177.5 95.6,177.7 96.5,177.7 96.5,177.6 97.4,177.6 97.4,177.7 98.3,177.7 98.3,177.1 99.2,177.1 99.2,176.8 100.1,176.8 100.1,177.7 101.0,177.7 101.0,177.6 101.9,177.6 101.9,176.8 102.8,176.8 102.8,177.8 103.7,177.8 103.7,177.0 104.6,177.0 104.6,176.8 105.5,176.8 105.5,178.0 106.4,178.0 106.4,178.1 107.4,178.1 107.4,177.6 108.3,177.6 108.3,177.6 109.2,177.6 109.2,177.4 110.1,177.4 110.1,177.6 111.0,177.6 111.0,177.8 111.9,177.8 111.9,177.5 112.8,177.5 112.8,177.9 113.7,177.9 113.7,177.7 114.6,177.7 114.6,175.9 115.5,175.9 115.5,177.5 116.4,177.5 116.4,177.6 117.3,177.6 117.3,177.6 118.2,177.6 118.2,176.9 119.1,176.9 119.1,177.5 120.0,177.5 120.0,177.4 120.9,177.4 120.9,177.4 121.8,177.4 121.8,176.9 122.7,176.9 122.7,177.9 123.6,177.9 123.6,177.3 124.6,177.3 124.6,176.6 125.5,176.6 125.5,177.4 126.4,177.4 126.4,177.5 127.3,177.5 127.3,177.5 128.2,177.5 128.2,177.4 129.1,177.4 129.1,177.0 130.0,177.0 130.0,177.7 130.9,177.7 130.9,176.2 131.8,176.2 131.8,176.9 132.7,176.9 132.7,177.5 133.6,177.5 133.6,177.8 134.5,177.8 134.5,177.8 135.4,177.8 135.4,177.9 136.3,177.9 136.3,177.3 137.2,177.3 137.2,177.5 138.1,177.5 138.1,177.4 139.0,177.4 139.0,177.1 139.9,177.1 139.9,162.5 140.8,162.5 140.8,162.2 141.7,162.2 141.7,161.8 142.7,161.8 142.7,162.2 143.6,162.2 143.6,161.2 144.5,161.2 144.5,160.7 145.4,160.7 145.4,159.4 146.3,159.4 146.3,160.3 147.2,160.3 147.2,160.4 148.1,160.4 148.1,160.6 149.0,160.6 149.0,159.5 149.9,159.5 149.9,160.4 150.8,160.4 150.8,159.6 151.7,159.6 151.7,160.0 152.6,160.0 152.6,159.9 153.5,159.9 153.5,160.2 154.4,160.2 154.4,159.6 155.3,159.6 155.3,160.8 156.2,160.8 156.2,160.1 157.1,160.1 157.1,159.1 158.0,159.1 158.0,159.7 158.9,159.7 158.9,159.9 159.8,159.9 159.8,160.5 160.8,160.5 160.8,160.2 161.7,160.2 161.7,159.9 162.6,159.9 162.6,160.5 163.5,160.5 163.5,160.5 164.4,160.5 164.4,160.6 165.3,160.6 165.3,159.7 166.2,159.7 166.2,159.5 167.1,159.5 167.1,160.0 168.0,160.0 168.0,160.2 168.9,160.2 168.9,160.0 169.8,160.0 169.8,160.6 170.7,160.6 170.7,159.9 171.6,159.9 171.6,160.2 172.5,160.2 172.5,160.1 173.4,160.1 173.4,160.8 174.3,160.8 174.3,159.2 175.2,159.2 175.2,159.6 176.1,159.6 176.1,159.2 177.0,159.2 177.0,160.0 177.9,160.0 177.9,159.4 178.9,159.4 178.9,159.6 179.8,159.6 179.8,159.5 180.7,159.5 180.7,160.1 181.6,160.1 181.6,159.0 182.5,159.0 182.5,159.4 183.4,159.4 183.4,160.2 184.3,160.2 184.3,161.4 185.2,161.4 185.2,161.7 186.1,161.7 186.1,161.6 187.0,161.6 187.0,160.3 187.9,160.3 187.9,161.1 188.8,161.1 188.8,161.2 189.7,161.2 189.7,161.7 190.6,161.7 190.6,161.2 191.5,161.2 191.5,160.4 192.4,160.4 192.4,161.6 193.3,161.6 193.3,160.6 194.2,160.6 194.2,161.4 195.1,161.4 195.1,161.3 196.1,161.3 196.1,161.3 197.0,161.3 197.0,161.7 197.9,161.7 197.9,161.2 198.8,161.2 198.8,160.1 199.7,160.1 199.7,160.9 200.6,160.9 200.6,161.5 201.5,161.5 201.5,160.6 202.4,160.6 202.4,161.9 203.3,161.9 203.3,161.4 204.2,161.4 204.2,160.1 205.1,160.1 205.1,160.6 206.0,160.6 206.0,162.0 206.9,162.0 206.9,161.5 207.8,161.5 207.8,162.0 208.7,162.0 208.7,161.3 209.6,161.3 209.6,162.3 210.5,162.3 210.5,162.1 211.4,162.1 211.4,160.8 212.3,160.8 212.3,161.5 213.2,161.5 213.2,161.4 214.2,161.4 214.2,162.2 215.1,162.2 215.1,161.4 216.0,161.4 216.0,161.4 216.9,161.4 216.9,161.8 217.8,161.8 217.8,160.7 218.7,160.7 218.7,160.5 219.6,160.5 219.6,160.5 220.5,160.5 220.5,159.3 221.4,159.3 221.4,159.4 222.3,159.4 222.3,160.4 223.2,160.4 223.2,160.1 224.1,160.1 224.1,160.4 225.0,160.4 225.0,160.4 225.9,160.4 225.9,160.8 226.8,160.8 226.8,159.8 227.7,159.8 227.7,159.4 228.6,159.4 228.6,160.5 229.5,160.5 229.5,160.1 230.4,160.1 230.4,160.7 231.3,160.7 231.3,160.6 232.3,160.6 232.3,159.5 233.2,159.5 233.2,161.1 234.1,161.1 234.1,161.3 235.0,161.3 235.0,161.0 235.9Line truncated
<circle class="nj-charts-json-dot" cx="93.8" cy="178.2" r="3.5"><title>#5234: 1.55&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="93.8" y1="54.0" x2="93.8" y2="173.2"/>
<circle class="nj-theme-dot" cx="93.8" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="93.8" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="139.9" cy="162.5" r="3.5"><title>#5283: 1.95&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="139.9" y1="54.0" x2="139.9" y2="157.5"/>
<circle class="nj-theme-dot" cx="139.9" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="139.9" y="50.0" text-anchor="middle">1</text>
<circle class="nj-charts-json-dot" cx="243.1" cy="155.4" r="3.5"><title>#5592: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="243.1" y1="54.0" x2="243.1" y2="150.4"/>
<circle class="nj-theme-dot" cx="243.1" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="243.1" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="265.7" cy="147.1" r="3.5"><title>#5809: 2.4&#215;</title></circle>
<circle class="nj-charts-json-dot" cx="266.6" cy="138.2" r="3.5"><title>#5810: 2.8&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="266.6" y1="36.0" x2="266.6" y2="133.2"/>
<circle class="nj-theme-dot" cx="257.6" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="257.6" y="32.0" text-anchor="middle">4</text>
<circle class="nj-theme-dot" cx="275.6" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="275.6" y="32.0" text-anchor="middle">2</text>
<circle class="nj-charts-json-dot" cx="312.8" cy="125.7" r="3.5"><title>#5882: 3.3&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="312.8" y1="54.0" x2="312.8" y2="120.7"/>
<circle class="nj-theme-dot" cx="312.8" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="312.8" y="50.0" text-anchor="middle">4</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

@@ -1,26 +1,28 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-parse_twitter_ifstream nj-blog-tl-parse_twitter_ifstream-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-parse_twitter_ifstream">parse() twitter.json, std::ifstream: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-parse_twitter_ifstream-d">parse() twitter.json, std::ifstream: speedup over 3.12.0 at each of 317 commits, ending at 2.2x. Labeled steps: #5828, #5884.</desc>
<desc id="nj-blog-tl-parse_twitter_ifstream-d">parse() twitter.json, std::ifstream: speedup over 3.12.0 at each of 317 commits, ending at 2.2x. Labeled steps, by theme: 1, 1.</desc>
<text class="nj-charts-panel" x="8" y="18">parse() twitter.json, std::ifstream</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="135" x2="330" y2="135"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="139">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="137" x2="330" y2="137"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="141">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">4&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,209.3 45.8,209.3 45.8,206.6 46.7,206.6 46.7,208.4 47.6,208.4 47.6,205.9 48.5,205.9 48.5,209.4 49.4,209.4 49.4,208.3 50.3,208.3 50.3,207.9 51.2,207.9 51.2,209.5 52.1,209.5 52.1,205.7 53.1,205.7 53.1,206.7 54.0,206.7 54.0,209.2 54.9,209.2 54.9,208.2 55.8,208.2 55.8,206.9 56.7,206.9 56.7,207.4 57.6,207.4 57.6,207.4 58.5,207.4 58.5,207.5 59.4,207.5 59.4,206.9 60.3,206.9 60.3,206.9 61.2,206.9 61.2,208.4 62.1,208.4 62.1,208.6 63.0,208.6 63.0,209.2 63.9,209.2 63.9,207.7 64.8,207.7 64.8,207.0 65.7,207.0 65.7,206.7 66.6,206.7 66.6,206.0 67.5,206.0 67.5,207.5 68.4,207.5 68.4,206.3 69.3,206.3 69.3,206.7 70.2,206.7 70.2,206.7 71.2,206.7 71.2,209.3 72.1,209.3 72.1,206.7 73.0,206.7 73.0,206.8 73.9,206.8 73.9,206.6 74.8,206.6 74.8,206.8 75.7,206.8 75.7,209.2 76.6,209.2 76.6,207.6 77.5,207.6 77.5,205.9 78.4,205.9 78.4,209.1 79.3,209.1 79.3,206.6 80.2,206.6 80.2,207.4 81.1,207.4 81.1,206.9 82.0,206.9 82.0,209.1 82.9,209.1 82.9,205.7 83.8,205.7 83.8,206.9 84.7,206.9 84.7,208.0 85.6,208.0 85.6,208.5 86.5,208.5 86.5,206.5 87.4,206.5 87.4,206.0 88.3,206.0 88.3,207.9 89.3,207.9 89.3,206.6 90.2,206.6 90.2,206.5 91.1,206.5 91.1,206.5 92.0,206.5 92.0,207.1 92.9,207.1 92.9,208.0 93.8,208.0 93.8,208.1 94.7,208.1 94.7,206.7 95.6,206.7 95.6,207.8 96.5,207.8 96.5,206.6 97.4,206.6 97.4,208.1 98.3,208.1 98.3,205.9 99.2,205.9 99.2,206.7 100.1,206.7 100.1,208.0 101.0,208.0 101.0,207.3 101.9,207.3 101.9,206.7 102.8,206.7 102.8,209.3 103.7,209.3 103.7,206.5 104.6,206.5 104.6,207.2 105.5,207.2 105.5,208.2 106.4,208.2 106.4,209.3 107.4,209.3 107.4,207.8 108.3,207.8 108.3,206.9 109.2,206.9 109.2,206.7 110.1,206.7 110.1,209.0 111.0,209.0 111.0,208.0 111.9,208.0 111.9,208.1 112.8,208.1 112.8,209.2 113.7,209.2 113.7,208.1 114.6,208.1 114.6,205.5 115.5,205.5 115.5,206.9 116.4,206.9 116.4,206.6 117.3,206.6 117.3,207.8 118.2,207.8 118.2,206.7 119.1,206.7 119.1,206.9 120.0,206.9 120.0,206.7 120.9,206.7 120.9,206.3 121.8,206.3 121.8,207.1 122.7,207.1 122.7,208.6 123.6,208.6 123.6,208.7 124.6,208.7 124.6,206.6 125.5,206.6 125.5,209.3 126.4,209.3 126.4,208.0 127.3,208.0 127.3,206.7 128.2,206.7 128.2,207.7 129.1,207.7 129.1,206.9 130.0,206.9 130.0,208.9 130.9,208.9 130.9,208.7 131.8,208.7 131.8,207.7 132.7,207.7 132.7,208.8 133.6,208.8 133.6,207.8 134.5,207.8 134.5,210.4 135.4,210.4 135.4,209.0 136.3,209.0 136.3,209.0 137.2,209.0 137.2,209.1 138.1,209.1 138.1,208.0 139.0,208.0 139.0,207.7 139.9,207.7 139.9,208.3 140.8,208.3 140.8,207.0 141.7,207.0 141.7,207.2 142.7,207.2 142.7,207.5 143.6,207.5 143.6,208.0 144.5,208.0 144.5,207.6 145.4,207.6 145.4,207.9 146.3,207.9 146.3,207.6 147.2,207.6 147.2,208.5 148.1,208.5 148.1,209.2 149.0,209.2 149.0,206.3 149.9,206.3 149.9,208.8 150.8,208.8 150.8,207.6 151.7,207.6 151.7,207.4 152.6,207.4 152.6,207.5 153.5,207.5 153.5,209.0 154.4,209.0 154.4,206.8 155.3,206.8 155.3,209.3 156.2,209.3 156.2,210.0 157.1,210.0 157.1,207.0 158.0,207.0 158.0,207.3 158.9,207.3 158.9,208.1 159.8,208.1 159.8,209.8 160.8,209.8 160.8,208.1 161.7,208.1 161.7,208.1 162.6,208.1 162.6,208.6 163.5,208.6 163.5,208.2 164.4,208.2 164.4,210.4 165.3,210.4 165.3,207.7 166.2,207.7 166.2,207.2 167.1,207.2 167.1,206.6 168.0,206.6 168.0,210.0 168.9,210.0 168.9,206.5 169.8,206.5 169.8,210.0 170.7,210.0 170.7,208.8 171.6,208.8 171.6,208.8 172.5,208.8 172.5,209.5 173.4,209.5 173.4,208.9 174.3,208.9 174.3,206.3 175.2,206.3 175.2,207.2 176.1,207.2 176.1,206.9 177.0,206.9 177.0,207.2 177.9,207.2 177.9,206.5 178.9,206.5 178.9,207.1 179.8,207.1 179.8,208.0 180.7,208.0 180.7,207.6 181.6,207.6 181.6,207.9 182.5,207.9 182.5,207.5 183.4,207.5 183.4,205.6 184.3,205.6 184.3,208.0 185.2,208.0 185.2,209.7 186.1,209.7 186.1,207.9 187.0,207.9 187.0,207.6 187.9,207.6 187.9,208.5 188.8,208.5 188.8,207.9 189.7,207.9 189.7,210.5 190.6,210.5 190.6,206.7 191.5,206.7 191.5,207.7 192.4,207.7 192.4,209.2 193.3,209.2 193.3,206.7 194.2,206.7 194.2,209.3 195.1,209.3 195.1,208.0 196.1,208.0 196.1,208.0 197.0,208.0 197.0,207.9 197.9,207.9 197.9,208.2 198.8,208.2 198.8,207.9 199.7,207.9 199.7,207.0 200.6,207.0 200.6,208.8 201.5,208.8 201.5,208.0 202.4,208.0 202.4,208.0 203.3,208.0 203.3,209.2 204.2,209.2 204.2,206.7 205.1,206.7 205.1,206.6 206.0,206.6 206.0,208.5 206.9,208.5 206.9,208.9 207.8,208.9 207.8,210.1 208.7,210.1 208.7,206.4 209.6,206.4 209.6,209.4 210.5,209.4 210.5,210.1 211.4,210.1 211.4,207.6 212.3,207.6 212.3,209.5 213.2,209.5 213.2,208.7 214.2,208.7 214.2,211.2 215.1,211.2 215.1,210.1 216.0,210.1 216.0,211.8 216.9,211.8 216.9,208.8 217.8,208.8 217.8,209.2 218.7,209.2 218.7,207.7 219.6,207.7 219.6,208.1 220.5,208.1 220.5,206.3 221.4,206.3 221.4,206.7 222.3,206.7 222.3,207.3 223.2,207.3 223.2,207.8 224.1,207.8 224.1,208.7 225.0,208.7 225.0,210.1 225.9,210.1 225.9,210.1 226.8,210.1 226.8,206.8 227.7,206.8 227.7,209.0 228.6,209.0 228.6,208.7 229.5,208.7 229.5,209.2 230.4,209.2 230.4,208.6 231.3,208.6 231.3,209.0 232.3,209.0 232.3,207.3 233.2,207.3 233.2,209.0 234.1,209.0 234.1,209.3 235.0,209.3 235.0,207.3 235.9Line truncated
<circle class="nj-charts-json-dot" cx="287.5" cy="136.8" r="3.5"><title>#5828: 1.97&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="287.5" y1="54.0" x2="287.5" y2="131.8"/>
<text class="nj-charts-note" x="287.5" y="50.0" text-anchor="middle">#5828</text>
<circle class="nj-charts-json-dot" cx="306.5" cy="124.7" r="3.5"><title>#5884: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="306.5" y1="41.0" x2="306.5" y2="119.7"/>
<text class="nj-charts-note" x="306.5" y="37.0" text-anchor="middle">#5884</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,209.3 45.8,209.3 45.8,206.6 46.7,206.6 46.7,208.3 47.6,208.3 47.6,205.9 48.5,205.9 48.5,209.3 49.4,209.3 49.4,208.3 50.3,208.3 50.3,207.9 51.2,207.9 51.2,209.4 52.1,209.4 52.1,205.8 53.1,205.8 53.1,206.7 54.0,206.7 54.0,209.2 54.9,209.2 54.9,208.1 55.8,208.1 55.8,206.9 56.7,206.9 56.7,207.5 57.6,207.5 57.6,207.5 58.5,207.5 58.5,207.6 59.4,207.6 59.4,206.9 60.3,206.9 60.3,206.9 61.2,206.9 61.2,208.4 62.1,208.4 62.1,208.6 63.0,208.6 63.0,209.1 63.9,209.1 63.9,207.7 64.8,207.7 64.8,207.0 65.7,207.0 65.7,206.7 66.6,206.7 66.6,206.1 67.5,206.1 67.5,207.5 68.4,207.5 68.4,206.4 69.3,206.4 69.3,206.7 70.2,206.7 70.2,206.8 71.2,206.8 71.2,209.3 72.1,209.3 72.1,206.7 73.0,206.7 73.0,206.8 73.9,206.8 73.9,206.6 74.8,206.6 74.8,206.8 75.7,206.8 75.7,209.2 76.6,209.2 76.6,207.6 77.5,207.6 77.5,205.9 78.4,205.9 78.4,209.1 79.3,209.1 79.3,206.6 80.2,206.6 80.2,207.4 81.1,207.4 81.1,207.0 82.0,207.0 82.0,209.1 82.9,209.1 82.9,205.8 83.8,205.8 83.8,206.9 84.7,206.9 84.7,208.0 85.6,208.0 85.6,208.5 86.5,208.5 86.5,206.6 87.4,206.6 87.4,206.0 88.3,206.0 88.3,207.9 89.3,207.9 89.3,206.6 90.2,206.6 90.2,206.5 91.1,206.5 91.1,206.6 92.0,206.6 92.0,207.2 92.9,207.2 92.9,208.0 93.8,208.0 93.8,208.1 94.7,208.1 94.7,206.7 95.6,206.7 95.6,207.8 96.5,207.8 96.5,206.7 97.4,206.7 97.4,208.1 98.3,208.1 98.3,205.9 99.2,205.9 99.2,206.8 100.1,206.8 100.1,208.0 101.0,208.0 101.0,207.3 101.9,207.3 101.9,206.7 102.8,206.7 102.8,209.3 103.7,209.3 103.7,206.5 104.6,206.5 104.6,207.2 105.5,207.2 105.5,208.2 106.4,208.2 106.4,209.3 107.4,209.3 107.4,207.8 108.3,207.8 108.3,206.9 109.2,206.9 109.2,206.7 110.1,206.7 110.1,209.0 111.0,209.0 111.0,208.0 111.9,208.0 111.9,208.1 112.8,208.1 112.8,209.1 113.7,209.1 113.7,208.1 114.6,208.1 114.6,205.6 115.5,205.6 115.5,207.0 116.4,207.0 116.4,206.7 117.3,206.7 117.3,207.9 118.2,207.9 118.2,206.7 119.1,206.7 119.1,206.9 120.0,206.9 120.0,206.8 120.9,206.8 120.9,206.4 121.8,206.4 121.8,207.1 122.7,207.1 122.7,208.6 123.6,208.6 123.6,208.7 124.6,208.7 124.6,206.6 125.5,206.6 125.5,209.3 126.4,209.3 126.4,208.0 127.3,208.0 127.3,206.7 128.2,206.7 128.2,207.7 129.1,207.7 129.1,206.9 130.0,206.9 130.0,208.8 130.9,208.8 130.9,208.7 131.8,208.7 131.8,207.7 132.7,207.7 132.7,208.8 133.6,208.8 133.6,207.8 134.5,207.8 134.5,210.3 135.4,210.3 135.4,208.9 136.3,208.9 136.3,208.9 137.2,208.9 137.2,209.0 138.1,209.0 138.1,208.0 139.0,208.0 139.0,207.7 139.9,207.7 139.9,208.3 140.8,208.3 140.8,207.0 141.7,207.0 141.7,207.2 142.7,207.2 142.7,207.5 143.6,207.5 143.6,208.0 144.5,208.0 144.5,207.6 145.4,207.6 145.4,207.9 146.3,207.9 146.3,207.6 147.2,207.6 147.2,208.5 148.1,208.5 148.1,209.2 149.0,209.2 149.0,206.3 149.9,206.3 149.9,208.7 150.8,208.7 150.8,207.6 151.7,207.6 151.7,207.4 152.6,207.4 152.6,207.5 153.5,207.5 153.5,209.0 154.4,209.0 154.4,206.9 155.3,206.9 155.3,209.3 156.2,209.3 156.2,209.9 157.1,209.9 157.1,207.0 158.0,207.0 158.0,207.3 158.9,207.3 158.9,208.1 159.8,208.1 159.8,209.8 160.8,209.8 160.8,208.1 161.7,208.1 161.7,208.1 162.6,208.1 162.6,208.5 163.5,208.5 163.5,208.2 164.4,208.2 164.4,210.4 165.3,210.4 165.3,207.7 166.2,207.7 166.2,207.2 167.1,207.2 167.1,206.7 168.0,206.7 168.0,209.9 168.9,209.9 168.9,206.6 169.8,206.6 169.8,209.9 170.7,209.9 170.7,208.8 171.6,208.8 171.6,208.8 172.5,208.8 172.5,209.5 173.4,209.5 173.4,208.9 174.3,208.9 174.3,206.4 175.2,206.4 175.2,207.2 176.1,207.2 176.1,207.0 177.0,207.0 177.0,207.2 177.9,207.2 177.9,206.6 178.9,206.6 178.9,207.2 179.8,207.2 179.8,208.0 180.7,208.0 180.7,207.6 181.6,207.6 181.6,207.9 182.5,207.9 182.5,207.5 183.4,207.5 183.4,205.6 184.3,205.6 184.3,208.0 185.2,208.0 185.2,209.7 186.1,209.7 186.1,207.9 187.0,207.9 187.0,207.6 187.9,207.6 187.9,208.5 188.8,208.5 188.8,207.9 189.7,207.9 189.7,210.4 190.6,210.4 190.6,206.7 191.5,206.7 191.5,207.7 192.4,207.7 192.4,209.2 193.3,209.2 193.3,206.8 194.2,206.8 194.2,209.3 195.1,209.3 195.1,208.0 196.1,208.0 196.1,208.0 197.0,208.0 197.0,207.9 197.9,207.9 197.9,208.2 198.8,208.2 198.8,207.9 199.7,207.9 199.7,207.0 200.6,207.0 200.6,208.8 201.5,208.8 201.5,208.0 202.4,208.0 202.4,208.0 203.3,208.0 203.3,209.2 204.2,209.2 204.2,206.7 205.1,206.7 205.1,206.7 206.0,206.7 206.0,208.5 206.9,208.5 206.9,208.9 207.8,208.9 207.8,210.1 208.7,210.1 208.7,206.4 209.6,206.4 209.6,209.4 210.5,209.4 210.5,210.1 211.4,210.1 211.4,207.6 212.3,207.6 212.3,209.5 213.2,209.5 213.2,208.7 214.2,208.7 214.2,211.1 215.1,211.1 215.1,210.1 216.0,210.1 216.0,211.7 216.9,211.7 216.9,208.8 217.8,208.8 217.8,209.2 218.7,209.2 218.7,207.7 219.6,207.7 219.6,208.1 220.5,208.1 220.5,206.4 221.4,206.4 221.4,206.7 222.3,206.7 222.3,207.3 223.2,207.3 223.2,207.8 224.1,207.8 224.1,208.7 225.0,208.7 225.0,210.1 225.9,210.1 225.9,210.0 226.8,210.0 226.8,206.9 227.7,206.9 227.7,209.0 228.6,209.0 228.6,208.7 229.5,208.7 229.5,209.1 230.4,209.1 230.4,208.6 231.3,208.6 231.3,208.9 232.3,208.9 232.3,207.3 233.2,207.3 233.2,208.9 234.1,208.9 234.1,209.2 235.0,209.2 235.0,207.3 235.9Line truncated
<circle class="nj-charts-json-dot" cx="287.5" cy="138.8" r="3.5"><title>#5828: 1.97&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="287.5" y1="54.0" x2="287.5" y2="133.8"/>
<circle class="nj-theme-dot" cx="287.5" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="287.5" y="50.0" text-anchor="middle">1</text>
<circle class="nj-charts-json-dot" cx="306.5" cy="127.0" r="3.5"><title>#5884: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="306.5" y1="54.0" x2="306.5" y2="122.0"/>
<circle class="nj-theme-dot" cx="306.5" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="306.5" y="50.0" text-anchor="middle">1</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

@@ -1,31 +1,34 @@
<svg class="nj-fig nj-charts nj-charts--timeline" viewBox="0 0 340 270" role="img" aria-labelledby="nj-blog-tl-to_cbor_twitter nj-blog-tl-to_cbor_twitter-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-tl-to_cbor_twitter">to_cbor() twitter: speedup over 3.12.0 by commit</title>
<desc id="nj-blog-tl-to_cbor_twitter-d">to_cbor() twitter: speedup over 3.12.0 at each of 317 commits, ending at 5.0x. Labeled steps: #5328, #5824, #5885.</desc>
<desc id="nj-blog-tl-to_cbor_twitter-d">to_cbor() twitter: speedup over 3.12.0 at each of 317 commits, ending at 5.0x. Labeled steps, by theme: 4, 6, 6.</desc>
<text class="nj-charts-panel" x="8" y="18">to_cbor() twitter</text>
<line class="nj-charts-grid" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="212">1&#215;</text>
<line class="nj-charts-grid" x1="44" y1="159.333" x2="330" y2="159.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="163.333">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="110.667" x2="330" y2="110.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="114.667">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="62" x2="330" y2="62"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="66">8&#215;</text>
<line class="nj-charts-grid" x1="44" y1="160.667" x2="330" y2="160.667"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="164.667">2&#215;</text>
<line class="nj-charts-grid" x1="44" y1="113.333" x2="330" y2="113.333"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="117.333">4&#215;</text>
<line class="nj-charts-grid" x1="44" y1="66" x2="330" y2="66"/>
<text class="nj-charts-tick nj-charts-tick--r" x="38" y="70">8&#215;</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="44" y2="212"/>
<text class="nj-charts-tick" x="44" y="225">3.12.0</text>
<line class="nj-charts-axis" x1="126.361" y1="208" x2="126.361" y2="212"/>
<text class="nj-charts-tick" x="126.361" y="225">Sep 2026</text>
<line class="nj-charts-axis" x1="215.962" y1="208" x2="215.962" y2="212"/>
<text class="nj-charts-tick" x="215.962" y="225">Oct</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.0 45.8,208.0 45.8,204.8 46.7,204.8 46.7,205.2 47.6,205.2 47.6,204.6 48.5,204.6 48.5,205.2 49.4,205.2 49.4,204.9 50.3,204.9 50.3,204.8 51.2,204.8 51.2,205.0 52.1,205.0 52.1,204.9 53.1,204.9 53.1,205.0 54.0,205.0 54.0,205.3 54.9,205.3 54.9,204.9 55.8,204.9 55.8,205.1 56.7,205.1 56.7,211.7 57.6,211.7 57.6,206.7 58.5,206.7 58.5,204.1 59.4,204.1 59.4,207.6 60.3,207.6 60.3,204.0 61.2,204.0 61.2,203.7 62.1,203.7 62.1,204.0 63.0,204.0 63.0,205.0 63.9,205.0 63.9,204.3 64.8,204.3 64.8,204.2 65.7,204.2 65.7,203.9 66.6,203.9 66.6,202.6 67.5,202.6 67.5,204.1 68.4,204.1 68.4,204.1 69.3,204.1 69.3,204.1 70.2,204.1 70.2,204.3 71.2,204.3 71.2,206.1 72.1,206.1 72.1,204.2 73.0,204.2 73.0,204.0 73.9,204.0 73.9,204.2 74.8,204.2 74.8,204.2 75.7,204.2 75.7,204.2 76.6,204.2 76.6,204.1 77.5,204.1 77.5,204.3 78.4,204.3 78.4,204.7 79.3,204.7 79.3,208.4 80.2,208.4 80.2,203.4 81.1,203.4 81.1,206.1 82.0,206.1 82.0,204.3 82.9,204.3 82.9,203.1 83.8,203.1 83.8,204.0 84.7,204.0 84.7,204.1 85.6,204.1 85.6,203.6 86.5,203.6 86.5,204.1 87.4,204.1 87.4,203.0 88.3,203.0 88.3,204.1 89.3,204.1 89.3,204.3 90.2,204.3 90.2,203.6 91.1,203.6 91.1,204.3 92.0,204.3 92.0,204.6 92.9,204.6 92.9,204.5 93.8,204.5 93.8,208.7 94.7,208.7 94.7,205.1 95.6,205.1 95.6,205.4 96.5,205.4 96.5,205.1 97.4,205.1 97.4,205.2 98.3,205.2 98.3,206.8 99.2,206.8 99.2,204.5 100.1,204.5 100.1,205.4 101.0,205.4 101.0,205.0 101.9,205.0 101.9,204.6 102.8,204.6 102.8,205.6 103.7,205.6 103.7,204.9 104.6,204.9 104.6,204.8 105.5,204.8 105.5,206.4 106.4,206.4 106.4,205.5 107.4,205.5 107.4,204.9 108.3,204.9 108.3,209.3 109.2,209.3 109.2,205.8 110.1,205.8 110.1,206.4 111.0,206.4 111.0,205.5 111.9,205.5 111.9,205.2 112.8,205.2 112.8,205.3 113.7,205.3 113.7,205.1 114.6,205.1 114.6,204.3 115.5,204.3 115.5,204.5 116.4,204.5 116.4,204.7 117.3,204.7 117.3,204.0 118.2,204.0 118.2,203.6 119.1,203.6 119.1,204.3 120.0,204.3 120.0,202.7 120.9,202.7 120.9,203.3 121.8,203.3 121.8,203.9 122.7,203.9 122.7,204.2 123.6,204.2 123.6,202.8 124.6,202.8 124.6,203.1 125.5,203.1 125.5,204.3 126.4,204.3 126.4,204.4 127.3,204.4 127.3,204.0 128.2,204.0 128.2,208.3 129.1,208.3 129.1,203.7 130.0,203.7 130.0,206.9 130.9,206.9 130.9,205.9 131.8,205.9 131.8,205.4 132.7,205.4 132.7,205.2 133.6,205.2 133.6,205.8 134.5,205.8 134.5,205.3 135.4,205.3 135.4,205.6 136.3,205.6 136.3,206.3 137.2,206.3 137.2,205.4 138.1,205.4 138.1,204.7 139.0,204.7 139.0,204.5 139.9,204.5 139.9,206.0 140.8,206.0 140.8,204.5 141.7,204.5 141.7,204.0 142.7,204.0 142.7,204.2 143.6,204.2 143.6,205.5 144.5,205.5 144.5,203.8 145.4,203.8 145.4,203.9 146.3,203.9 146.3,203.8 147.2,203.8 147.2,204.5 148.1,204.5 148.1,204.0 149.0,204.0 149.0,203.8 149.9,203.8 149.9,204.8 150.8,204.8 150.8,203.1 151.7,203.1 151.7,203.2 152.6,203.2 152.6,204.6 153.5,204.6 153.5,208.3 154.4,208.3 154.4,204.2 155.3,204.2 155.3,207.4 156.2,207.4 156.2,204.3 157.1,204.3 157.1,208.3 158.0,208.3 158.0,204.9 158.9,204.9 158.9,204.8 159.8,204.8 159.8,208.9 160.8,208.9 160.8,207.9 161.7,207.9 161.7,206.2 162.6,206.2 162.6,204.1 163.5,204.1 163.5,204.0 164.4,204.0 164.4,204.1 165.3,204.1 165.3,202.0 166.2,202.0 166.2,205.5 167.1,205.5 167.1,202.9 168.0,202.9 168.0,203.2 168.9,203.2 168.9,202.5 169.8,202.5 169.8,203.5 170.7,203.5 170.7,203.1 171.6,203.1 171.6,203.0 172.5,203.0 172.5,204.8 173.4,204.8 173.4,202.8 174.3,202.8 174.3,202.1 175.2,202.1 175.2,202.3 176.1,202.3 176.1,202.8 177.0,202.8 177.0,202.8 177.9,202.8 177.9,202.2 178.9,202.2 178.9,202.8 179.8,202.8 179.8,203.6 180.7,203.6 180.7,204.0 181.6,204.0 181.6,203.8 182.5,203.8 182.5,203.6 183.4,203.6 183.4,203.2 184.3,203.2 184.3,203.7 185.2,203.7 185.2,204.9 186.1,204.9 186.1,208.0 187.0,208.0 187.0,205.1 187.9,205.1 187.9,206.4 188.8,206.4 188.8,205.3 189.7,205.3 189.7,205.4 190.6,205.4 190.6,206.9 191.5,206.9 191.5,204.8 192.4,204.8 192.4,205.4 193.3,205.4 193.3,203.5 194.2,203.5 194.2,205.7 195.1,205.7 195.1,204.4 196.1,204.4 196.1,204.9 197.0,204.9 197.0,205.1 197.9,205.1 197.9,204.8 198.8,204.8 198.8,204.4 199.7,204.4 199.7,204.8 200.6,204.8 200.6,205.2 201.5,205.2 201.5,203.8 202.4,203.8 202.4,204.7 203.3,204.7 203.3,204.7 204.2,204.7 204.2,203.5 205.1,203.5 205.1,203.3 206.0,203.3 206.0,203.7 206.9,203.7 206.9,205.0 207.8,205.0 207.8,205.4 208.7,205.4 208.7,203.9 209.6,203.9 209.6,204.8 210.5,204.8 210.5,204.9 211.4,204.9 211.4,206.4 212.3,206.4 212.3,205.0 213.2,205.0 213.2,204.4 214.2,204.4 214.2,204.7 215.1,204.7 215.1,205.1 216.0,205.1 216.0,204.9 216.9,204.9 216.9,204.5 217.8,204.5 217.8,203.7 218.7,203.7 218.7,203.3 219.6,203.3 219.6,203.5 220.5,203.5 220.5,204.1 221.4,204.1 221.4,205.9 222.3,205.9 222.3,205.1 223.2,205.1 223.2,204.7 224.1,204.7 224.1,207.3 225.0,207.3 225.0,205.1 225.9,205.1 225.9,208.6 226.8,208.6 226.8,204.2 227.7,204.2 227.7,203.8 228.6,203.8 228.6,203.0 229.5,203.0 229.5,203.7 230.4,203.7 230.4,205.8 231.3,205.8 231.3,204.8 232.3,204.8 232.3,204.7 233.2,204.7 233.2,203.5 234.1,203.5 234.1,203.6 235.0,203.6 235.0,208.2 235.9Line truncated
<circle class="nj-charts-json-dot" cx="256.7" cy="152.2" r="3.5"><title>#5328: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="256.7" y1="54.0" x2="256.7" y2="147.2"/>
<text class="nj-charts-note" x="256.7" y="50.0" text-anchor="middle">#5328</text>
<circle class="nj-charts-json-dot" cx="295.6" cy="121.0" r="3.5"><title>#5824: 3.5&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="295.6" y1="41.0" x2="295.6" y2="116.0"/>
<text class="nj-charts-note" x="295.6" y="37.0" text-anchor="middle">#5824</text>
<circle class="nj-charts-json-dot" cx="309.2" cy="93.7" r="3.5"><title>#5885: 5.1&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="309.2" y1="54.0" x2="309.2" y2="88.7"/>
<text class="nj-charts-note" x="309.2" y="50.0" text-anchor="middle">#5885</text>
<polyline class="nj-charts-json" points="44.0,208.0 44.9,208.0 44.9,208.0 45.8,208.0 45.8,204.9 46.7,204.9 46.7,205.2 47.6,205.2 47.6,204.7 48.5,204.7 48.5,205.2 49.4,205.2 49.4,205.0 50.3,205.0 50.3,204.9 51.2,204.9 51.2,205.0 52.1,205.0 52.1,205.0 53.1,205.0 53.1,205.1 54.0,205.1 54.0,205.4 54.9,205.4 54.9,205.0 55.8,205.0 55.8,205.2 56.7,205.2 56.7,211.6 57.6,211.6 57.6,206.8 58.5,206.8 58.5,204.2 59.4,204.2 59.4,207.6 60.3,207.6 60.3,204.1 61.2,204.1 61.2,203.8 62.1,203.8 62.1,204.2 63.0,204.2 63.0,205.1 63.9,205.1 63.9,204.4 64.8,204.4 64.8,204.3 65.7,204.3 65.7,204.0 66.6,204.0 66.6,202.7 67.5,202.7 67.5,204.2 68.4,204.2 68.4,204.2 69.3,204.2 69.3,204.2 70.2,204.2 70.2,204.4 71.2,204.4 71.2,206.2 72.1,206.2 72.1,204.3 73.0,204.3 73.0,204.1 73.9,204.1 73.9,204.3 74.8,204.3 74.8,204.3 75.7,204.3 75.7,204.3 76.6,204.3 76.6,204.3 77.5,204.3 77.5,204.4 78.4,204.4 78.4,204.8 79.3,204.8 79.3,208.4 80.2,208.4 80.2,203.5 81.1,203.5 81.1,206.2 82.0,206.2 82.0,204.4 82.9,204.4 82.9,203.2 83.8,203.2 83.8,204.1 84.7,204.1 84.7,204.2 85.6,204.2 85.6,203.7 86.5,203.7 86.5,204.2 87.4,204.2 87.4,203.2 88.3,203.2 88.3,204.2 89.3,204.2 89.3,204.4 90.2,204.4 90.2,203.8 91.1,203.8 91.1,204.4 92.0,204.4 92.0,204.7 92.9,204.7 92.9,204.6 93.8,204.6 93.8,208.7 94.7,208.7 94.7,205.2 95.6,205.2 95.6,205.5 96.5,205.5 96.5,205.2 97.4,205.2 97.4,205.3 98.3,205.3 98.3,206.8 99.2,206.8 99.2,204.6 100.1,204.6 100.1,205.5 101.0,205.5 101.0,205.1 101.9,205.1 101.9,204.7 102.8,204.7 102.8,205.7 103.7,205.7 103.7,205.0 104.6,205.0 104.6,204.9 105.5,204.9 105.5,206.5 106.4,206.5 106.4,205.6 107.4,205.6 107.4,205.0 108.3,205.0 108.3,209.2 109.2,209.2 109.2,205.9 110.1,205.9 110.1,206.5 111.0,206.5 111.0,205.5 111.9,205.5 111.9,205.3 112.8,205.3 112.8,205.3 113.7,205.3 113.7,205.1 114.6,205.1 114.6,204.4 115.5,204.4 115.5,204.6 116.4,204.6 116.4,204.8 117.3,204.8 117.3,204.2 118.2,204.2 118.2,203.8 119.1,203.8 119.1,204.4 120.0,204.4 120.0,202.8 120.9,202.8 120.9,203.5 121.8,203.5 121.8,204.0 122.7,204.0 122.7,204.3 123.6,204.3 123.6,202.9 124.6,202.9 124.6,203.3 125.5,203.3 125.5,204.4 126.4,204.4 126.4,204.5 127.3,204.5 127.3,204.1 128.2,204.1 128.2,208.3 129.1,208.3 129.1,203.8 130.0,203.8 130.0,207.0 130.9,207.0 130.9,205.9 131.8,205.9 131.8,205.4 132.7,205.4 132.7,205.3 133.6,205.3 133.6,205.8 134.5,205.8 134.5,205.4 135.4,205.4 135.4,205.6 136.3,205.6 136.3,206.3 137.2,206.3 137.2,205.5 138.1,205.5 138.1,204.8 139.0,204.8 139.0,204.6 139.9,204.6 139.9,206.1 140.8,206.1 140.8,204.6 141.7,204.6 141.7,204.1 142.7,204.1 142.7,204.3 143.6,204.3 143.6,205.6 144.5,205.6 144.5,203.9 145.4,203.9 145.4,204.0 146.3,204.0 146.3,203.9 147.2,203.9 147.2,204.6 148.1,204.6 148.1,204.1 149.0,204.1 149.0,203.9 149.9,203.9 149.9,204.8 150.8,204.8 150.8,203.2 151.7,203.2 151.7,203.3 152.6,203.3 152.6,204.7 153.5,204.7 153.5,208.3 154.4,208.3 154.4,204.3 155.3,204.3 155.3,207.4 156.2,207.4 156.2,204.4 157.1,204.4 157.1,208.2 158.0,208.2 158.0,205.0 158.9,205.0 158.9,204.9 159.8,204.9 159.8,208.8 160.8,208.8 160.8,207.9 161.7,207.9 161.7,206.2 162.6,206.2 162.6,204.2 163.5,204.2 163.5,204.1 164.4,204.1 164.4,204.2 165.3,204.2 165.3,202.2 166.2,202.2 166.2,205.6 167.1,205.6 167.1,203.0 168.0,203.0 168.0,203.4 168.9,203.4 168.9,202.7 169.8,202.7 169.8,203.6 170.7,203.6 170.7,203.3 171.6,203.3 171.6,203.2 172.5,203.2 172.5,204.9 173.4,204.9 173.4,202.9 174.3,202.9 174.3,202.2 175.2,202.2 175.2,202.5 176.1,202.5 176.1,202.9 177.0,202.9 177.0,202.9 177.9,202.9 177.9,202.3 178.9,202.3 178.9,202.9 179.8,202.9 179.8,203.7 180.7,203.7 180.7,204.1 181.6,204.1 181.6,203.9 182.5,203.9 182.5,203.7 183.4,203.7 183.4,203.3 184.3,203.3 184.3,203.8 185.2,203.8 185.2,205.0 186.1,205.0 186.1,208.0 187.0,208.0 187.0,205.1 187.9,205.1 187.9,206.5 188.8,206.5 188.8,205.4 189.7,205.4 189.7,205.4 190.6,205.4 190.6,207.0 191.5,207.0 191.5,204.9 192.4,204.9 192.4,205.4 193.3,205.4 193.3,203.6 194.2,203.6 194.2,205.7 195.1,205.7 195.1,204.5 196.1,204.5 196.1,205.0 197.0,205.0 197.0,205.2 197.9,205.2 197.9,204.9 198.8,204.9 198.8,204.5 199.7,204.5 199.7,204.9 200.6,204.9 200.6,205.3 201.5,205.3 201.5,203.9 202.4,203.9 202.4,204.8 203.3,204.8 203.3,204.8 204.2,204.8 204.2,203.6 205.1,203.6 205.1,203.4 206.0,203.4 206.0,203.8 206.9,203.8 206.9,205.1 207.8,205.1 207.8,205.5 208.7,205.5 208.7,204.0 209.6,204.0 209.6,204.9 210.5,204.9 210.5,205.0 211.4,205.0 211.4,206.4 212.3,206.4 212.3,205.1 213.2,205.1 213.2,204.5 214.2,204.5 214.2,204.8 215.1,204.8 215.1,205.2 216.0,205.2 216.0,205.0 216.9,205.0 216.9,204.6 217.8,204.6 217.8,203.9 218.7,203.9 218.7,203.5 219.6,203.5 219.6,203.6 220.5,203.6 220.5,204.2 221.4,204.2 221.4,205.9 222.3,205.9 222.3,205.2 223.2,205.2 223.2,204.8 224.1,204.8 224.1,207.3 225.0,207.3 225.0,205.2 225.9,205.2 225.9,208.6 226.8,208.6 226.8,204.3 227.7,204.3 227.7,203.9 228.6,203.9 228.6,203.2 229.5,203.2 229.5,203.9 230.4,203.9 230.4,205.9 231.3,205.9 231.3,204.8 232.3,204.8 232.3,204.7 233.2,204.7 233.2,203.6 234.1,203.6 234.1,203.7 235.0,203.7 235.0,208.2 235.9Line truncated
<circle class="nj-charts-json-dot" cx="256.7" cy="153.7" r="3.5"><title>#5328: 2.2&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="256.7" y1="54.0" x2="256.7" y2="148.7"/>
<circle class="nj-theme-dot" cx="256.7" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="256.7" y="50.0" text-anchor="middle">4</text>
<circle class="nj-charts-json-dot" cx="295.6" cy="123.4" r="3.5"><title>#5824: 3.5&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="295.6" y1="54.0" x2="295.6" y2="118.4"/>
<circle class="nj-theme-dot" cx="295.6" cy="46.0" r="7.5"/>
<text class="nj-theme-num" x="295.6" y="50.0" text-anchor="middle">6</text>
<circle class="nj-charts-json-dot" cx="309.2" cy="96.9" r="3.5"><title>#5885: 5.1&#215;</title></circle>
<line class="nj-charts-grid" stroke-dasharray="2 2" x1="309.2" y1="36.0" x2="309.2" y2="91.9"/>
<circle class="nj-theme-dot" cx="309.2" cy="28.0" r="7.5"/>
<text class="nj-theme-num" x="309.2" y="32.0" text-anchor="middle">6</text>
<line class="nj-charts-axis" x1="44" y1="208" x2="330" y2="208"/>
<text class="nj-charts-note" x="8" y="262">speedup over 3.12.0 (log scale), more is better</text>
</svg>

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 9.9 KiB

@@ -0,0 +1,359 @@
<svg class="nj-fig nj-charts nj-charts--blog nj-charts--heat" viewBox="0 0 784 510" role="img" aria-labelledby="nj-blog-uc-mac nj-blog-uc-mac-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-uc-mac">Use cases: time of each library relative to the fastest, Apple M1 Max</title>
<desc id="nj-blog-uc-mac-d">Table of relative times, libraries by use case. nlohmann/json json_document validate: 1.00; nlohmann/json json_document sum: 1.00; nlohmann/json json_document select: 1.00; nlohmann/json json_document edit: 1.00; nlohmann/json json_document minify: 1.00; nlohmann/json json_document write: 1.00; yyjson validate: 1.30; yyjson sum: 1.14; yyjson select: 1.29; yyjson edit: 1.48; yyjson minify: 1.24; yyjson write: 1.24; sonic-rs (Rust) validate: 1.79; sonic-rs (Rust) sum: 1.54; sonic-rs (Rust) select: 1.84; sonic-rs (Rust) edit: 2.09; sonic-rs (Rust) minify: 1.93; sonic-rs (Rust) write: 2.37; simdjson validate: 1.46; simdjson sum: 1.24; simdjson select: 1.48 (0.85 checking less, partial); simdjson edit: n/a; simdjson minify: 2.41 (0.19 checking less, partial); simdjson write: 4.02; simd-json (Rust) validate: 1.95; simd-json (Rust) sum: 1.65; simd-json (Rust) select: 2.35; simd-json (Rust) edit: 2.84; simd-json (Rust) minify: 3.39; simd-json (Rust) write: 3.13; sonic-cpp validate: no fully validating way (2.33 checking less, no U&#8203;TF-8); sonic-cpp sum: no fully validating way (1.85 checking less, no U&#8203;TF-8); sonic-cpp select: no fully validating way (2.30 checking less, no U&#8203;TF-8); sonic-cpp edit: no fully validating way (1.70 checking less, no U&#8203;TF-8); sonic-cpp minify: no fully validating way (2.02 checking less, no U&#8203;TF-8); sonic-cpp write: 1.59; Glaze validate: 1.88; Glaze sum: 5.58; Glaze select: 1.82 (0.83 checking less, partial); Glaze edit: 4.44; Glaze minify: 5.18 (1.04 checking less, partial); Glaze write: 2.21; Boost.J&#8203;SON validate: 2.87; Boost.J&#8203;SON sum: 2.00; Boost.J&#8203;SON select: 4.09; Boost.J&#8203;SON edit: 3.23; Boost.J&#8203;SON minify: 3.86; Boost.J&#8203;SON write: 3.68; serde_json (Rust) validate: 2.28 (2.06 checking less, no U&#8203;TF-8); serde_json (Rust) sum: 2.59; serde_json (Rust) select: 2.38 (2.24 checking less, no U&#8203;TF-8); serde_json (Rust) edit: 4.97; serde_json (Rust) minify: 5.80; serde_json (Rust) write: 2.95; nlohmann/json json validate: 2.65; nlohmann/json json sum: 1.96; nlohmann/json json select: 6.83; nlohmann/json json edit: 3.58; nlohmann/json json minify: 4.87; nlohmann/json json write: 2.05; RapidJSON validate: 6.21 (4.04 checking less, no U&#8203;TF-8); RapidJSON sum: 4.45 (3.02 checking less, no U&#8203;TF-8); RapidJSON select: 5.90 (3.85 checking less, no U&#8203;TF-8); RapidJSON edit: 4.85 (3.82 checking less, no U&#8203;TF-8); RapidJSON minify: 4.85 (4.54 checking less, no U&#8203;TF-8); RapidJSON write: 5.78.</desc>
<text class="nj-charts-tick" x="270" y="34">validate</text>
<text class="nj-charts-tick" x="362" y="34">sum</text>
<text class="nj-charts-tick" x="454" y="34">select</text>
<text class="nj-charts-tick" x="546" y="34">edit</text>
<text class="nj-charts-tick" x="638" y="34">minify</text>
<text class="nj-charts-tick" x="730" y="34">write</text>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="66" text-anchor="end">nlohmann/json json_document</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · validate&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 176 µs&#10;citm_catalog.json: 359 µs&#10;canada.json: 943 µs&#10;jeopardy.json: 22,862 µs">
<rect class="nj-heat-0" x="225" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · sum&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 226 µs&#10;citm_catalog.json: 480 µs&#10;canada.json: 1,804 µs&#10;jeopardy.json: 29,208 µs">
<rect class="nj-heat-0" x="317" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · select&#10;1.00× the time of the fastest library (fully validating)&#10;twitter.json: 187 µs · structs (from_json)&#10;citm_catalog.json: 367 µs · parse&#10;canada.json: 987 µs · structs (from_json)&#10;jeopardy.json: 24,409 µs · parse">
<rect class="nj-heat-0" x="409" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · edit&#10;1.00× the time of the fastest library (fully validating)&#10;way: editable&#10;twitter.json: 290 µs&#10;citm_catalog.json: 560 µs&#10;canada.json: 2,742 µs&#10;jeopardy.json: 58,265 µs">
<rect class="nj-heat-0" x="501" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · minify&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 264 µs&#10;citm_catalog.json: 496 µs&#10;canada.json: 2,566 µs&#10;jeopardy.json: 37,936 µs">
<rect class="nj-heat-0" x="593" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · write&#10;1.00× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 75.2 µs&#10;citm_catalog.json: 136 µs&#10;canada.json: 1,621 µs&#10;jeopardy.json: 14,846 µs">
<rect class="nj-heat-0" x="685" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="66" text-anchor="middle">1.00</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="102" text-anchor="end">yyjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · validate&#10;1.30× the time of the fastest library (fully validating)&#10;twitter.json: 180 µs · insitu (copy)&#10;citm_catalog.json: 473 µs · read&#10;canada.json: 1,493 µs · read&#10;jeopardy.json: 30,542 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="225" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="102" text-anchor="middle">1.30</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · sum&#10;1.14× the time of the fastest library (fully validating)&#10;twitter.json: 229 µs · insitu (copy)&#10;citm_catalog.json: 573 µs · read&#10;canada.json: 1,937 µs · read&#10;jeopardy.json: 37,916 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-0" x="317" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="102" text-anchor="middle">1.14</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · select&#10;1.29× the time of the fastest library (fully validating)&#10;twitter.json: 188 µs · insitu (copy)&#10;citm_catalog.json: 481 µs · read&#10;canada.json: 1,493 µs · read&#10;jeopardy.json: 33,546 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="409" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="102" text-anchor="middle">1.29</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · edit&#10;1.48× the time of the fastest library (fully validating)&#10;twitter.json: 438 µs · insitu (copy) + mut copy&#10;citm_catalog.json: 900 µs · mut copy&#10;canada.json: 3,694 µs · insitu (copy) + mut copy&#10;jeopardy.json: 84,447 µs · mut copy&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="501" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="102" text-anchor="middle">1.48</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · minify&#10;1.24× the time of the fastest library (fully validating)&#10;twitter.json: 289 µs · insitu (copy) + write&#10;citm_catalog.json: 640 µs · insitu (copy) + write&#10;canada.json: 3,213 µs · read + write&#10;jeopardy.json: 50,740 µs · read + write&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="593" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="102" text-anchor="middle">1.24</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · write&#10;1.24× the time of the fastest library (fully validating)&#10;way: write&#10;twitter.json: 104 µs&#10;citm_catalog.json: 164 µs&#10;canada.json: 1,717 µs&#10;jeopardy.json: 20,119 µs">
<rect class="nj-heat-1" x="685" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="102" text-anchor="middle">1.24</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="138" text-anchor="end">sonic-rs (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · validate&#10;1.79× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 329 µs&#10;citm_catalog.json: 684 µs&#10;canada.json: 1,930 µs&#10;jeopardy.json: 32,169 µs">
<rect class="nj-heat-2" x="225" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="138" text-anchor="middle">1.79</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · sum&#10;1.54× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 372 µs&#10;citm_catalog.json: 778 µs&#10;canada.json: 2,695 µs&#10;jeopardy.json: 41,462 µs">
<rect class="nj-heat-2" x="317" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="138" text-anchor="middle">1.54</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · select&#10;1.84× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 340 µs&#10;citm_catalog.json: 700 µs&#10;canada.json: 1,938 µs&#10;jeopardy.json: 41,203 µs">
<rect class="nj-heat-2" x="409" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="138" text-anchor="middle">1.84</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · edit&#10;2.09× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 634 µs&#10;citm_catalog.json: 1,264 µs&#10;canada.json: 4,379 µs&#10;jeopardy.json: 140,693 µs">
<rect class="nj-heat-2" x="501" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="138" text-anchor="middle">2.09</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · minify&#10;1.93× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 546 µs&#10;citm_catalog.json: 1,139 µs&#10;canada.json: 4,366 µs&#10;jeopardy.json: 64,830 µs">
<rect class="nj-heat-2" x="593" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="138" text-anchor="middle">1.93</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · write&#10;2.37× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 214 µs&#10;citm_catalog.json: 454 µs&#10;canada.json: 2,414 µs&#10;jeopardy.json: 33,358 µs">
<rect class="nj-heat-2" x="685" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="138" text-anchor="middle">2.37</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="174" text-anchor="end">simdjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · validate&#10;1.46× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 221 µs&#10;citm_catalog.json: 493 µs&#10;canada.json: 2,104 µs&#10;jeopardy.json: 27,311 µs">
<rect class="nj-heat-1" x="225" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="174" text-anchor="middle">1.46</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · sum&#10;1.24× the time of the fastest library (fully validating)&#10;twitter.json: 256 µs · On-Demand&#10;citm_catalog.json: 608 µs · On-Demand&#10;canada.json: 2,594 µs · D&#8203;OM&#10;jeopardy.json: 33,706 µs · D&#8203;OM">
<rect class="nj-heat-1" x="317" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="174" text-anchor="middle">1.24</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select&#10;1.48× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 231 µs&#10;citm_catalog.json: 510 µs&#10;canada.json: 2,104 µs&#10;jeopardy.json: 32,075 µs">
<rect class="nj-heat-1" x="409" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="174" text-anchor="middle">1.48</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select, checking less&#10;0.85× the time of the fastest fully validating library&#10;way: On-Demand&#10;twitter.json: 144 µs&#10;citm_catalog.json: 500 µs&#10;canada.json: 646 µs&#10;jeopardy.json: 18,601 µs&#10;reads lazily: On-Demand reads only what you ask for and steps over the rest by matching brackets">
<rect class="nj-heat-0" x="455" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="168" text-anchor="middle">0.85</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · edit&#10;simdjson&#x27;s documents are read-only: it has no A&#8203;PI to change a value and write the result">
<rect class="nj-heat-na" x="501" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-tick" x="546" y="174">n/a</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify&#10;2.41× the time of the fastest library (fully validating)&#10;way: D&#8203;OM + to_string&#10;twitter.json: 590 µs&#10;citm_catalog.json: 990 µs&#10;canada.json: 8,949 µs&#10;jeopardy.json: 82,232 µs">
<rect class="nj-heat-2" x="593" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="174" text-anchor="middle">2.41</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify, checking less&#10;0.19× the time of the fastest fully validating library&#10;way: minify&#10;twitter.json: 65.0 µs&#10;citm_catalog.json: 178 µs&#10;canada.json: 236 µs&#10;jeopardy.json: 5,929 µs&#10;simdjson::minify() only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="168" text-anchor="middle">0.19</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · write&#10;4.02× the time of the fastest library (fully validating)&#10;way: to_string&#10;twitter.json: 352 µs&#10;citm_catalog.json: 494 µs&#10;canada.json: 6,770 µs&#10;jeopardy.json: 54,528 µs">
<rect class="nj-heat-3" x="685" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="174" text-anchor="middle">4.02</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="210" text-anchor="end">simd-json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · validate&#10;1.95× the time of the fastest library (fully validating)&#10;way: tape (copy)&#10;twitter.json: 304 µs&#10;citm_catalog.json: 709 µs&#10;canada.json: 2,286 µs&#10;jeopardy.json: 39,592 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="225" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="210" text-anchor="middle">1.95</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · sum&#10;1.65× the time of the fastest library (fully validating)&#10;way: visitor (copy)&#10;twitter.json: 372 µs&#10;citm_catalog.json: 866 µs&#10;canada.json: 2,727 µs&#10;jeopardy.json: 48,506 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="317" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="210" text-anchor="middle">1.65</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · select&#10;2.35× the time of the fastest library (fully validating)&#10;way: structs (copy)&#10;twitter.json: 375 µs&#10;citm_catalog.json: 871 µs&#10;canada.json: 2,660 µs&#10;jeopardy.json: 57,877 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="409" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="210" text-anchor="middle">2.35</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · edit&#10;2.84× the time of the fastest library (fully validating)&#10;way: borrowed (copy)&#10;twitter.json: 934 µs&#10;citm_catalog.json: 2,111 µs&#10;canada.json: 7,695 µs&#10;jeopardy.json: 111,832 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="210" text-anchor="middle">2.84</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · minify&#10;3.39× the time of the fastest library (fully validating)&#10;way: borrowed (copy)&#10;twitter.json: 959 µs&#10;citm_catalog.json: 2,097 µs&#10;canada.json: 7,743 µs&#10;jeopardy.json: 107,444 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="593" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="210" text-anchor="middle">3.39</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · write&#10;3.13× the time of the fastest library (fully validating)&#10;way: borrowed&#10;twitter.json: 364 µs&#10;citm_catalog.json: 496 µs&#10;canada.json: 2,723 µs&#10;jeopardy.json: 48,114 µs">
<rect class="nj-heat-3" x="685" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="210" text-anchor="middle">3.13</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="246" text-anchor="end">sonic-cpp</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · validate, checking less&#10;2.33× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 380 µs&#10;citm_catalog.json: 982 µs&#10;canada.json: 2,577 µs&#10;jeopardy.json: 41,571 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-2" x="225" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="240" text-anchor="middle">2.33</text>
<text class="nj-charts-cell nj-charts-cell--small" x="270" y="253" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · sum, checking less&#10;1.85× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 427 µs&#10;citm_catalog.json: 1,091 µs&#10;canada.json: 2,976 µs&#10;jeopardy.json: 48,840 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-2" x="317" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="240" text-anchor="middle">1.85</text>
<text class="nj-charts-cell nj-charts-cell--small" x="362" y="253" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · select, checking less&#10;2.30× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 385 µs&#10;citm_catalog.json: 992 µs&#10;canada.json: 2,590 µs&#10;jeopardy.json: 46,922 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-2" x="409" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="240" text-anchor="middle">2.30</text>
<text class="nj-charts-cell nj-charts-cell--small" x="454" y="253" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · edit, checking less&#10;1.70× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 490 µs&#10;citm_catalog.json: 1,227 µs&#10;canada.json: 5,655 µs&#10;jeopardy.json: 63,940 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-2" x="501" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="240" text-anchor="middle">1.70</text>
<text class="nj-charts-cell nj-charts-cell--small" x="546" y="253" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · minify, checking less&#10;2.02× the time of the fastest fully validating library&#10;way: Document + Serialize&#10;twitter.json: 497 µs&#10;citm_catalog.json: 1,219 µs&#10;canada.json: 5,658 µs&#10;jeopardy.json: 61,948 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-2" x="593" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="240" text-anchor="middle">2.02</text>
<text class="nj-charts-cell nj-charts-cell--small" x="638" y="253" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · write&#10;1.59× the time of the fastest library (fully validating)&#10;way: Serialize&#10;twitter.json: 111 µs&#10;citm_catalog.json: 231 µs&#10;canada.json: 3,047 µs&#10;jeopardy.json: 20,342 µs">
<rect class="nj-heat-2" x="685" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="246" text-anchor="middle">1.59</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="282" text-anchor="end">Glaze</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · validate&#10;1.88× the time of the fastest library (fully validating)&#10;way: validate_json&#10;twitter.json: 329 µs&#10;citm_catalog.json: 853 µs&#10;canada.json: 1,302 µs&#10;jeopardy.json: 46,471 µs">
<rect class="nj-heat-2" x="225" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="282" text-anchor="middle">1.88</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum&#10;5.58× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 1,323 µs&#10;citm_catalog.json: 2,845 µs&#10;canada.json: 9,777 µs&#10;jeopardy.json: 151,441 µs">
<rect class="nj-heat-4" x="317" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="282" text-anchor="middle">5.58</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select&#10;1.82× the time of the fastest library (fully validating)&#10;way: structs (validate_skipped)&#10;twitter.json: 312 µs&#10;citm_catalog.json: 873 µs&#10;canada.json: 1,304 µs&#10;jeopardy.json: 51,046 µs">
<rect class="nj-heat-2" x="409" y="261" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="282" text-anchor="middle">1.82</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select, checking less&#10;0.83× the time of the fastest fully validating library&#10;way: structs&#10;twitter.json: 238 µs&#10;citm_catalog.json: 252 µs&#10;canada.json: 316 µs&#10;jeopardy.json: 41,037 µs&#10;reads into structs and steps over fields it doesn&#x27;t know without checking them (validate_skipped checks them too)">
<rect class="nj-heat-0" x="455" y="261" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="276" text-anchor="middle">0.83</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="289" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · edit&#10;4.44× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 1,503 µs&#10;citm_catalog.json: 3,223 µs&#10;canada.json: 11,125 µs&#10;jeopardy.json: 187,294 µs">
<rect class="nj-heat-3" x="501" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="282" text-anchor="middle">4.44</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify&#10;5.18× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 1,488 µs&#10;citm_catalog.json: 3,208 µs&#10;canada.json: 11,076 µs&#10;jeopardy.json: 172,917 µs">
<rect class="nj-heat-4" x="593" y="261" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="282" text-anchor="middle">5.18</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify, checking less&#10;1.04× the time of the fastest fully validating library&#10;way: minify_json&#10;twitter.json: 283 µs&#10;citm_catalog.json: 740 µs&#10;canada.json: 1,808 µs&#10;jeopardy.json: 39,976 µs&#10;minify_json only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="261" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="276" text-anchor="middle">1.04</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="289" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · write&#10;2.21× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 212 µs&#10;citm_catalog.json: 469 µs&#10;canada.json: 1,692 µs&#10;jeopardy.json: 34,921 µs">
<rect class="nj-heat-2" x="685" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="282" text-anchor="middle">2.21</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="318" text-anchor="end">Boost.J&#8203;SON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · validate&#10;2.87× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 536 µs&#10;citm_catalog.json: 1,017 µs&#10;canada.json: 3,065 µs&#10;jeopardy.json: 55,102 µs">
<rect class="nj-heat-3" x="225" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="318" text-anchor="middle">2.87</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · sum&#10;2.00× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 537 µs&#10;citm_catalog.json: 1,020 µs&#10;canada.json: 3,046 µs&#10;jeopardy.json: 54,818 µs">
<rect class="nj-heat-2" x="317" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="318" text-anchor="middle">2.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · select&#10;4.09× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 889 µs&#10;citm_catalog.json: 1,490 µs&#10;canada.json: 3,632 µs&#10;jeopardy.json: 96,757 µs">
<rect class="nj-heat-3" x="409" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="318" text-anchor="middle">4.09</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · edit&#10;3.23× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 1,367 µs&#10;citm_catalog.json: 1,999 µs&#10;canada.json: 6,542 µs&#10;jeopardy.json: 157,555 µs">
<rect class="nj-heat-3" x="501" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="318" text-anchor="middle">3.23</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · minify&#10;3.86× the time of the fastest library (fully validating)&#10;way: parse + serialize&#10;twitter.json: 1,391 µs&#10;citm_catalog.json: 1,987 µs&#10;canada.json: 6,586 µs&#10;jeopardy.json: 154,714 µs">
<rect class="nj-heat-3" x="593" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="318" text-anchor="middle">3.86</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · write&#10;3.68× the time of the fastest library (fully validating)&#10;way: serialize&#10;twitter.json: 499 µs&#10;citm_catalog.json: 503 µs&#10;canada.json: 2,868 µs&#10;jeopardy.json: 62,964 µs">
<rect class="nj-heat-3" x="685" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="318" text-anchor="middle">3.68</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="354" text-anchor="end">serde_json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate&#10;2.28× the time of the fastest library (fully validating)&#10;way: from_utf8 + IgnoredAny&#10;twitter.json: 457 µs&#10;citm_catalog.json: 1,105 µs&#10;canada.json: 1,532 µs&#10;jeopardy.json: 47,547 µs">
<rect class="nj-heat-2" x="225" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="354" text-anchor="middle">2.28</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate, checking less&#10;2.06× the time of the fastest fully validating library&#10;way: IgnoredAny&#10;twitter.json: 354 µs&#10;citm_catalog.json: 1,052 µs&#10;canada.json: 1,459 µs&#10;jeopardy.json: 44,881 µs&#10;trusts U&#8203;TF-8 in the strings it skips (from_slice); strings it reads are checked">
<rect class="nj-heat-2" x="271" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="348" text-anchor="middle">2.06</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · sum&#10;2.59× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 665 µs&#10;citm_catalog.json: 1,229 µs&#10;canada.json: 4,813 µs&#10;jeopardy.json: 66,093 µs">
<rect class="nj-heat-3" x="317" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="354" text-anchor="middle">2.59</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · select&#10;2.38× the time of the fastest library (fully validating)&#10;way: from_utf8 + structs&#10;twitter.json: 483 µs&#10;citm_catalog.json: 1,121 µs&#10;canada.json: 1,532 µs&#10;jeopardy.json: 63,635 µs">
<rect class="nj-heat-2" x="409" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="354" text-anchor="middle">2.38</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · select, checking less&#10;2.24× the time of the fastest fully validating library&#10;twitter.json: 416 µs · structs&#10;citm_catalog.json: 1,082 µs · structs&#10;canada.json: 1,458 µs · structs&#10;jeopardy.json: 63,635 µs · from_utf8 + structs (validates fully)&#10;trusts U&#8203;TF-8 in the strings it skips (from_slice); strings it reads are checked">
<rect class="nj-heat-2" x="455" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="348" text-anchor="middle">2.24</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · edit&#10;4.97× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 2,001 µs&#10;citm_catalog.json: 3,287 µs&#10;canada.json: 9,670 µs&#10;jeopardy.json: 248,681 µs">
<rect class="nj-heat-3" x="501" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="354" text-anchor="middle">4.97</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · minify&#10;5.80× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 1,999 µs&#10;citm_catalog.json: 3,240 µs&#10;canada.json: 9,748 µs&#10;jeopardy.json: 227,301 µs">
<rect class="nj-heat-4" x="593" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="354" text-anchor="middle">5.80</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · write&#10;2.95× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 327 µs&#10;citm_catalog.json: 504 µs&#10;canada.json: 2,257 µs&#10;jeopardy.json: 49,857 µs">
<rect class="nj-heat-3" x="685" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="354" text-anchor="middle">2.95</text>
</g>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="390" text-anchor="end">nlohmann/json json</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · validate&#10;2.65× the time of the fastest library (fully validating)&#10;way: accept&#10;twitter.json: 481 µs&#10;citm_catalog.json: 897 µs&#10;canada.json: 2,463 µs&#10;jeopardy.json: 63,383 µs">
<rect class="nj-heat-3" x="225" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="390" text-anchor="middle">2.65</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · sum&#10;1.96× the time of the fastest library (fully validating)&#10;way: sax&#10;twitter.json: 461 µs&#10;citm_catalog.json: 928 µs&#10;canada.json: 3,100 µs&#10;jeopardy.json: 63,272 µs">
<rect class="nj-heat-2" x="317" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="390" text-anchor="middle">1.96</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · select&#10;6.83× the time of the fastest library (fully validating)&#10;twitter.json: 1,357 µs · structs (from_json)&#10;citm_catalog.json: 2,439 µs · structs (from_json)&#10;canada.json: 6,066 µs · structs (from_json)&#10;jeopardy.json: 179,366 µs · parse">
<rect class="nj-heat-4" x="409" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="390" text-anchor="middle">6.83</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · edit&#10;3.58× the time of the fastest library (fully validating)&#10;twitter.json: 1,269 µs · ordered_json&#10;citm_catalog.json: 2,376 µs · ordered_json&#10;canada.json: 8,194 µs · parse&#10;jeopardy.json: 173,089 µs · ordered_json">
<rect class="nj-heat-3" x="501" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="390" text-anchor="middle">3.58</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · minify&#10;4.87× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 1,592 µs&#10;citm_catalog.json: 2,694 µs&#10;canada.json: 8,280 µs&#10;jeopardy.json: 200,923 µs">
<rect class="nj-heat-3" x="593" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="390" text-anchor="middle">4.87</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · write&#10;2.05× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 220 µs&#10;citm_catalog.json: 286 µs&#10;canada.json: 2,240 µs&#10;jeopardy.json: 30,983 µs">
<rect class="nj-heat-2" x="685" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="390" text-anchor="middle">2.05</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="426" text-anchor="end">RapidJSON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate&#10;6.21× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,314 µs&#10;citm_catalog.json: 1,568 µs&#10;canada.json: 6,871 µs&#10;jeopardy.json: 142,654 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-4" x="225" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="426" text-anchor="middle">6.21</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate, checking less&#10;4.04× the time of the fastest fully validating library&#10;way: insitu (copy) (no encoding check)&#10;twitter.json: 704 µs&#10;citm_catalog.json: 1,150 µs&#10;canada.json: 6,851 µs&#10;jeopardy.json: 65,584 µs&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="271" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="420" text-anchor="middle">4.04</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum&#10;4.45× the time of the fastest library (fully validating)&#10;twitter.json: 1,331 µs · S&#8203;AX&#10;citm_catalog.json: 1,626 µs · S&#8203;AX&#10;canada.json: 6,924 µs · S&#8203;AX&#10;jeopardy.json: 149,474 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="317" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="426" text-anchor="middle">4.45</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum, checking less&#10;3.02× the time of the fastest fully validating library&#10;twitter.json: 755 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,258 µs · insitu (copy) (no encoding check)&#10;canada.json: 6,924 µs · S&#8203;AX (validates fully)&#10;jeopardy.json: 72,381 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="363" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="420" text-anchor="middle">3.02</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select&#10;5.90× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,319 µs&#10;citm_catalog.json: 1,572 µs&#10;canada.json: 6,762 µs&#10;jeopardy.json: 142,740 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-4" x="409" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="426" text-anchor="middle">5.90</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select, checking less&#10;3.85× the time of the fastest fully validating library&#10;twitter.json: 703 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,146 µs · insitu (copy) (no encoding check)&#10;canada.json: 6,762 µs · insitu (copy) (validates fully)&#10;jeopardy.json: 66,763 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="455" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="420" text-anchor="middle">3.85</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit&#10;4.85× the time of the fastest library (fully validating)&#10;twitter.json: 1,917 µs · Document&#10;citm_catalog.json: 2,404 µs · insitu (copy)&#10;canada.json: 13,880 µs · insitu (copy)&#10;jeopardy.json: 224,650 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="523.5" y="426" text-anchor="middle">4.85</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit, checking less&#10;3.82× the time of the fastest fully validating library&#10;twitter.json: 1,349 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,987 µs · insitu (copy) (no encoding check)&#10;canada.json: 13,880 µs · insitu (copy) (validates fully)&#10;jeopardy.json: 148,239 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="547" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="568.5" y="420" text-anchor="middle">3.82</text>
<text class="nj-charts-cell nj-charts-cell--small" x="568.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify&#10;4.85× the time of the fastest library (fully validating)&#10;twitter.json: 1,497 µs · S&#8203;AX to Writer&#10;citm_catalog.json: 1,797 µs · S&#8203;AX to Writer&#10;canada.json: 14,455 µs · Document + Writer&#10;jeopardy.json: 181,502 µs · S&#8203;AX to Writer">
<rect class="nj-heat-3" x="593" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="426" text-anchor="middle">4.85</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify, checking less&#10;4.54× the time of the fastest fully validating library&#10;twitter.json: 1,310 µs · S&#8203;AX to Writer (no encoding check)&#10;citm_catalog.json: 1,699 µs · S&#8203;AX to Writer (no encoding check)&#10;canada.json: 14,455 µs · Document + Writer (validates fully)&#10;jeopardy.json: 167,920 µs · S&#8203;AX to Writer (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)">
<rect class="nj-heat-3" x="639" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="420" text-anchor="middle">4.54</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · write&#10;5.78× the time of the fastest library (fully validating)&#10;way: Writer&#10;twitter.json: 592 µs&#10;citm_catalog.json: 818 µs&#10;canada.json: 6,947 µs&#10;jeopardy.json: 81,580 µs">
<rect class="nj-heat-4" x="685" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="426" text-anchor="middle">5.78</text>
</g>
<text class="nj-charts-tick nj-charts-tick--l" x="8" y="472">time relative to the fastest fully validating library, less is better</text>
<g><rect class="nj-heat-0" x="8" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="46" y="496" text-anchor="middle">below 1.15</text></g>
<g><rect class="nj-heat-1" x="88" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="126" y="496" text-anchor="middle">1.15 to 1.5</text></g>
<g><rect class="nj-heat-2" x="168" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="206" y="496" text-anchor="middle">1.5 to 2.5</text></g>
<g><rect class="nj-heat-3" x="248" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="286" y="496" text-anchor="middle">2.5 to 5</text></g>
<g><rect class="nj-heat-4" x="328" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="366" y="496" text-anchor="middle">5 and more</text></g>
<rect class="nj-heat-na" x="420" y="482" width="40" height="20" rx="3"/>
<text class="nj-charts-tick" x="440" y="496">n/a</text>
<text class="nj-charts-tick nj-charts-tick--l" x="468" y="496">no A&#8203;PI for it</text>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

@@ -0,0 +1,359 @@
<svg class="nj-fig nj-charts nj-charts--blog nj-charts--heat" viewBox="0 0 784 510" role="img" aria-labelledby="nj-blog-uc-x86-clang nj-blog-uc-x86-clang-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-uc-x86-clang">Use cases: time of each library relative to the fastest, x86-64 with Clang 23</title>
<desc id="nj-blog-uc-x86-clang-d">Table of relative times, libraries by use case. nlohmann/json json_document validate: 1.00; nlohmann/json json_document sum: 1.00; nlohmann/json json_document select: 1.00; nlohmann/json json_document edit: 1.00; nlohmann/json json_document minify: 1.00; nlohmann/json json_document write: 1.00; yyjson validate: 1.40; yyjson sum: 1.14; yyjson select: 1.38; yyjson edit: 1.50; yyjson minify: 1.28; yyjson write: 1.18; sonic-rs (Rust) validate: 1.15; sonic-rs (Rust) sum: 1.05; sonic-rs (Rust) select: 1.33; sonic-rs (Rust) edit: 1.90; sonic-rs (Rust) minify: 1.73; sonic-rs (Rust) write: 2.00; simdjson validate: 1.29; simdjson sum: 1.10; simdjson select: 1.29 (0.61 checking less, partial); simdjson edit: n/a; simdjson minify: 2.06 (0.19 checking less, partial); simdjson write: 3.18; sonic-cpp validate: no fully validating way (1.46 checking less, no U&#8203;TF-8); sonic-cpp sum: no fully validating way (1.18 checking less, no U&#8203;TF-8); sonic-cpp select: no fully validating way (1.43 checking less, no U&#8203;TF-8); sonic-cpp edit: no fully validating way (1.18 checking less, no U&#8203;TF-8); sonic-cpp minify: no fully validating way (1.37 checking less, no U&#8203;TF-8); sonic-cpp write: 1.37; Boost.J&#8203;SON validate: 1.58; Boost.J&#8203;SON sum: 1.10; Boost.J&#8203;SON select: 3.00; Boost.J&#8203;SON edit: 2.30; Boost.J&#8203;SON minify: 2.69; Boost.J&#8203;SON write: 2.36; simd-json (Rust) validate: 2.22; simd-json (Rust) sum: 1.83; simd-json (Rust) select: 2.54; simd-json (Rust) edit: 3.05; simd-json (Rust) minify: 3.42; simd-json (Rust) write: 2.24; serde_json (Rust) validate: 1.47 (1.31 checking less, no U&#8203;TF-8); serde_json (Rust) sum: 2.18; serde_json (Rust) select: 1.69; serde_json (Rust) edit: 5.01; serde_json (Rust) minify: 5.25; serde_json (Rust) write: 2.19; nlohmann/json json validate: 1.94; nlohmann/json json sum: 1.49; nlohmann/json json select: 7.92; nlohmann/json json edit: 4.24; nlohmann/json json minify: 5.30; nlohmann/json json write: 1.92; Glaze validate: 1.40; Glaze sum: 7.35 (5.04 checking less, partial); Glaze select: 1.35 (0.61 checking less, partial); Glaze edit: 6.32; Glaze minify: 6.39 (0.69 checking less, partial); Glaze write: 2.03; RapidJSON validate: 4.31 (3.29 checking less, no U&#8203;TF-8); RapidJSON sum: 3.16 (2.42 checking less, no U&#8203;TF-8); RapidJSON select: 4.32 (3.40 checking less, no U&#8203;TF-8); RapidJSON edit: 3.16 (2.69 checking less, no U&#8203;TF-8); RapidJSON minify: 3.48 (2.90 checking less, no U&#8203;TF-8); RapidJSON write: 2.93.</desc>
<text class="nj-charts-tick" x="270" y="34">validate</text>
<text class="nj-charts-tick" x="362" y="34">sum</text>
<text class="nj-charts-tick" x="454" y="34">select</text>
<text class="nj-charts-tick" x="546" y="34">edit</text>
<text class="nj-charts-tick" x="638" y="34">minify</text>
<text class="nj-charts-tick" x="730" y="34">write</text>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="66" text-anchor="end">nlohmann/json json_document</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · validate&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 302 µs&#10;citm_catalog.json: 720 µs&#10;canada.json: 1,784 µs&#10;jeopardy.json: 81,370 µs">
<rect class="nj-heat-0" x="225" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · sum&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 378 µs&#10;citm_catalog.json: 891 µs&#10;canada.json: 4,151 µs&#10;jeopardy.json: 89,689 µs">
<rect class="nj-heat-0" x="317" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · select&#10;1.00× the time of the fastest library (fully validating)&#10;twitter.json: 324 µs · parse&#10;citm_catalog.json: 728 µs · parse&#10;canada.json: 1,784 µs · structs (from_json)&#10;jeopardy.json: 89,731 µs · parse">
<rect class="nj-heat-0" x="409" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · edit&#10;1.00× the time of the fastest library (fully validating)&#10;way: editable&#10;twitter.json: 534 µs&#10;citm_catalog.json: 1,100 µs&#10;canada.json: 5,935 µs&#10;jeopardy.json: 208,247 µs">
<rect class="nj-heat-0" x="501" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · minify&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 474 µs&#10;citm_catalog.json: 993 µs&#10;canada.json: 5,445 µs&#10;jeopardy.json: 153,155 µs">
<rect class="nj-heat-0" x="593" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · write&#10;1.00× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 152 µs&#10;citm_catalog.json: 272 µs&#10;canada.json: 3,634 µs&#10;jeopardy.json: 68,840 µs">
<rect class="nj-heat-0" x="685" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="66" text-anchor="middle">1.00</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="102" text-anchor="end">yyjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · validate&#10;1.40× the time of the fastest library (fully validating)&#10;twitter.json: 379 µs · insitu (copy)&#10;citm_catalog.json: 896 µs · read&#10;canada.json: 2,851 µs · insitu (copy)&#10;jeopardy.json: 124,180 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="225" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="102" text-anchor="middle">1.40</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · sum&#10;1.14× the time of the fastest library (fully validating)&#10;twitter.json: 435 µs · insitu (copy)&#10;citm_catalog.json: 1,048 µs · insitu (copy)&#10;canada.json: 3,467 µs · insitu (copy)&#10;jeopardy.json: 135,382 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-0" x="317" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="102" text-anchor="middle">1.14</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · select&#10;1.38× the time of the fastest library (fully validating)&#10;twitter.json: 387 µs · insitu (copy)&#10;citm_catalog.json: 900 µs · insitu (copy)&#10;canada.json: 2,814 µs · read&#10;jeopardy.json: 139,634 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="409" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="102" text-anchor="middle">1.38</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · edit&#10;1.50× the time of the fastest library (fully validating)&#10;twitter.json: 912 µs · mut copy&#10;citm_catalog.json: 1,686 µs · mut copy&#10;canada.json: 7,407 µs · mut copy&#10;jeopardy.json: 318,770 µs · insitu (copy) + mut copy&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="501" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="102" text-anchor="middle">1.50</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · minify&#10;1.28× the time of the fastest library (fully validating)&#10;twitter.json: 625 µs · insitu (copy) + write&#10;citm_catalog.json: 1,256 µs · read + write&#10;canada.json: 6,261 µs · read + write&#10;jeopardy.json: 212,043 µs · insitu (copy) + write&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="593" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="102" text-anchor="middle">1.28</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · write&#10;1.18× the time of the fastest library (fully validating)&#10;way: write&#10;twitter.json: 219 µs&#10;citm_catalog.json: 364 µs&#10;canada.json: 3,380 µs&#10;jeopardy.json: 75,136 µs">
<rect class="nj-heat-1" x="685" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="102" text-anchor="middle">1.18</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="138" text-anchor="end">sonic-rs (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · validate&#10;1.15× the time of the fastest library (fully validating)&#10;way: IgnoredAny&#10;twitter.json: 470 µs&#10;citm_catalog.json: 966 µs&#10;canada.json: 2,249 µs&#10;jeopardy.json: 54,246 µs">
<rect class="nj-heat-1" x="225" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="138" text-anchor="middle">1.15</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · sum&#10;1.05× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 494 µs&#10;citm_catalog.json: 1,135 µs&#10;canada.json: 4,580 µs&#10;jeopardy.json: 59,149 µs">
<rect class="nj-heat-0" x="317" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="138" text-anchor="middle">1.05</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · select&#10;1.33× the time of the fastest library (fully validating)&#10;way: structs&#10;twitter.json: 557 µs&#10;citm_catalog.json: 1,023 µs&#10;canada.json: 2,247 µs&#10;jeopardy.json: 91,996 µs">
<rect class="nj-heat-1" x="409" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="138" text-anchor="middle">1.33</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · edit&#10;1.90× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 1,189 µs&#10;citm_catalog.json: 2,384 µs&#10;canada.json: 8,007 µs&#10;jeopardy.json: 413,714 µs">
<rect class="nj-heat-2" x="501" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="138" text-anchor="middle">1.90</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · minify&#10;1.73× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 988 µs&#10;citm_catalog.json: 2,093 µs&#10;canada.json: 7,775 µs&#10;jeopardy.json: 217,697 µs">
<rect class="nj-heat-2" x="593" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="138" text-anchor="middle">1.73</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · write&#10;2.00× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 442 µs&#10;citm_catalog.json: 935 µs&#10;canada.json: 3,954 µs&#10;jeopardy.json: 100,889 µs">
<rect class="nj-heat-2" x="685" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="138" text-anchor="middle">2.00</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="174" text-anchor="end">simdjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · validate&#10;1.29× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 311 µs&#10;citm_catalog.json: 736 µs&#10;canada.json: 3,343 µs&#10;jeopardy.json: 115,626 µs">
<rect class="nj-heat-1" x="225" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="174" text-anchor="middle">1.29</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · sum&#10;1.10× the time of the fastest library (fully validating)&#10;twitter.json: 399 µs · D&#8203;OM&#10;citm_catalog.json: 946 µs · D&#8203;OM&#10;canada.json: 4,100 µs · D&#8203;OM&#10;jeopardy.json: 120,056 µs · On-Demand">
<rect class="nj-heat-0" x="317" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="174" text-anchor="middle">1.10</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select&#10;1.29× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 330 µs&#10;citm_catalog.json: 743 µs&#10;canada.json: 3,291 µs&#10;jeopardy.json: 129,470 µs">
<rect class="nj-heat-1" x="409" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="174" text-anchor="middle">1.29</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select, checking less&#10;0.61× the time of the fastest fully validating library&#10;way: On-Demand&#10;twitter.json: 210 µs&#10;citm_catalog.json: 610 µs&#10;canada.json: 861 µs&#10;jeopardy.json: 48,548 µs&#10;reads lazily: On-Demand reads only what you ask for and steps over the rest by matching brackets">
<rect class="nj-heat-0" x="455" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="168" text-anchor="middle">0.61</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · edit&#10;simdjson&#x27;s documents are read-only: it has no A&#8203;PI to change a value and write the result">
<rect class="nj-heat-na" x="501" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-tick" x="546" y="174">n/a</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify&#10;2.06× the time of the fastest library (fully validating)&#10;way: D&#8203;OM + to_string&#10;twitter.json: 857 µs&#10;citm_catalog.json: 1,543 µs&#10;canada.json: 16,516 µs&#10;jeopardy.json: 326,881 µs">
<rect class="nj-heat-2" x="593" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="174" text-anchor="middle">2.06</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify, checking less&#10;0.19× the time of the fastest fully validating library&#10;way: minify&#10;twitter.json: 103 µs&#10;citm_catalog.json: 256 µs&#10;canada.json: 373 µs&#10;jeopardy.json: 51,243 µs&#10;simdjson::minify() only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="168" text-anchor="middle">0.19</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · write&#10;3.18× the time of the fastest library (fully validating)&#10;way: to_string&#10;twitter.json: 551 µs&#10;citm_catalog.json: 803 µs&#10;canada.json: 12,977 µs&#10;jeopardy.json: 183,837 µs">
<rect class="nj-heat-3" x="685" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="174" text-anchor="middle">3.18</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="210" text-anchor="end">sonic-cpp</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · validate, checking less&#10;1.46× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 450 µs&#10;citm_catalog.json: 1,026 µs&#10;canada.json: 3,140 µs&#10;jeopardy.json: 98,200 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="225" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="204" text-anchor="middle">1.46</text>
<text class="nj-charts-cell nj-charts-cell--small" x="270" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · sum, checking less&#10;1.18× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 504 µs&#10;citm_catalog.json: 1,180 µs&#10;canada.json: 3,736 µs&#10;jeopardy.json: 110,324 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="317" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="204" text-anchor="middle">1.18</text>
<text class="nj-charts-cell nj-charts-cell--small" x="362" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · select, checking less&#10;1.43× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 461 µs&#10;citm_catalog.json: 1,024 µs&#10;canada.json: 3,030 µs&#10;jeopardy.json: 109,906 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="409" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="204" text-anchor="middle">1.43</text>
<text class="nj-charts-cell nj-charts-cell--small" x="454" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · edit, checking less&#10;1.18× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 644 µs&#10;citm_catalog.json: 1,508 µs&#10;canada.json: 7,972 µs&#10;jeopardy.json: 184,491 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="501" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="204" text-anchor="middle">1.18</text>
<text class="nj-charts-cell nj-charts-cell--small" x="546" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · minify, checking less&#10;1.37× the time of the fastest fully validating library&#10;way: Document + Serialize&#10;twitter.json: 647 µs&#10;citm_catalog.json: 1,487 µs&#10;canada.json: 7,924 µs&#10;jeopardy.json: 182,940 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="593" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="204" text-anchor="middle">1.37</text>
<text class="nj-charts-cell nj-charts-cell--small" x="638" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · write&#10;1.37× the time of the fastest library (fully validating)&#10;way: Serialize&#10;twitter.json: 231 µs&#10;citm_catalog.json: 475 µs&#10;canada.json: 4,851 µs&#10;jeopardy.json: 69,344 µs">
<rect class="nj-heat-1" x="685" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="210" text-anchor="middle">1.37</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="246" text-anchor="end">Boost.J&#8203;SON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · validate&#10;1.58× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 596 µs&#10;citm_catalog.json: 923 µs&#10;canada.json: 6,234 µs&#10;jeopardy.json: 56,654 µs">
<rect class="nj-heat-2" x="225" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="246" text-anchor="middle">1.58</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · sum&#10;1.10× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 582 µs&#10;citm_catalog.json: 927 µs&#10;canada.json: 5,935 µs&#10;jeopardy.json: 56,310 µs">
<rect class="nj-heat-0" x="317" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="246" text-anchor="middle">1.10</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · select&#10;3.00× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 1,264 µs&#10;citm_catalog.json: 1,659 µs&#10;canada.json: 7,173 µs&#10;jeopardy.json: 202,456 µs">
<rect class="nj-heat-3" x="409" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="246" text-anchor="middle">3.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · edit&#10;2.30× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 1,722 µs&#10;citm_catalog.json: 2,614 µs&#10;canada.json: 12,953 µs&#10;jeopardy.json: 346,073 µs">
<rect class="nj-heat-2" x="501" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="246" text-anchor="middle">2.30</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · minify&#10;2.69× the time of the fastest library (fully validating)&#10;way: parse + serialize&#10;twitter.json: 1,758 µs&#10;citm_catalog.json: 2,553 µs&#10;canada.json: 12,744 µs&#10;jeopardy.json: 358,018 µs">
<rect class="nj-heat-3" x="593" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="246" text-anchor="middle">2.69</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · write&#10;2.36× the time of the fastest library (fully validating)&#10;way: serialize&#10;twitter.json: 489 µs&#10;citm_catalog.json: 902 µs&#10;canada.json: 5,659 µs&#10;jeopardy.json: 127,823 µs">
<rect class="nj-heat-2" x="685" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="246" text-anchor="middle">2.36</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="282" text-anchor="end">simd-json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · validate&#10;2.22× the time of the fastest library (fully validating)&#10;way: tape (copy)&#10;twitter.json: 592 µs&#10;citm_catalog.json: 1,426 µs&#10;canada.json: 4,303 µs&#10;jeopardy.json: 211,716 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="225" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="282" text-anchor="middle">2.22</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · sum&#10;1.83× the time of the fastest library (fully validating)&#10;way: visitor (copy)&#10;twitter.json: 722 µs&#10;citm_catalog.json: 1,686 µs&#10;canada.json: 5,191 µs&#10;jeopardy.json: 220,582 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="317" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="282" text-anchor="middle">1.83</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · select&#10;2.54× the time of the fastest library (fully validating)&#10;way: structs (copy)&#10;twitter.json: 730 µs&#10;citm_catalog.json: 1,658 µs&#10;canada.json: 4,915 µs&#10;jeopardy.json: 266,073 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="409" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="282" text-anchor="middle">2.54</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · edit&#10;3.05× the time of the fastest library (fully validating)&#10;twitter.json: 2,071 µs · borrowed (copy)&#10;citm_catalog.json: 4,465 µs · borrowed (copy)&#10;canada.json: 16,360 µs · owned (copy)&#10;jeopardy.json: 416,658 µs · borrowed (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="282" text-anchor="middle">3.05</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · minify&#10;3.42× the time of the fastest library (fully validating)&#10;way: borrowed (copy)&#10;twitter.json: 1,924 µs&#10;citm_catalog.json: 4,375 µs&#10;canada.json: 15,278 µs&#10;jeopardy.json: 419,474 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="593" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="282" text-anchor="middle">3.42</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · write&#10;2.24× the time of the fastest library (fully validating)&#10;way: borrowed&#10;twitter.json: 604 µs&#10;citm_catalog.json: 809 µs&#10;canada.json: 4,825 µs&#10;jeopardy.json: 110,710 µs">
<rect class="nj-heat-2" x="685" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="282" text-anchor="middle">2.24</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="318" text-anchor="end">serde_json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate&#10;1.47× the time of the fastest library (fully validating)&#10;way: from_utf8 + IgnoredAny&#10;twitter.json: 634 µs&#10;citm_catalog.json: 1,448 µs&#10;canada.json: 2,402 µs&#10;jeopardy.json: 66,822 µs">
<rect class="nj-heat-1" x="225" y="297" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="318" text-anchor="middle">1.47</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate, checking less&#10;1.31× the time of the fastest fully validating library&#10;way: IgnoredAny&#10;twitter.json: 487 µs&#10;citm_catalog.json: 1,370 µs&#10;canada.json: 2,318 µs&#10;jeopardy.json: 59,801 µs&#10;trusts U&#8203;TF-8 in the strings it skips (from_slice); strings it reads are checked">
<rect class="nj-heat-1" x="271" y="297" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="312" text-anchor="middle">1.31</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="325" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · sum&#10;2.18× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 1,318 µs&#10;citm_catalog.json: 2,299 µs&#10;canada.json: 7,610 µs&#10;jeopardy.json: 123,810 µs">
<rect class="nj-heat-2" x="317" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="318" text-anchor="middle">2.18</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · select&#10;1.69× the time of the fastest library (fully validating)&#10;way: from_utf8 + structs&#10;twitter.json: 769 µs&#10;citm_catalog.json: 1,504 µs&#10;canada.json: 2,442 µs&#10;jeopardy.json: 108,386 µs">
<rect class="nj-heat-2" x="409" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="318" text-anchor="middle">1.69</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · edit&#10;5.01× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 4,474 µs&#10;citm_catalog.json: 6,922 µs&#10;canada.json: 18,301 µs&#10;jeopardy.json: 805,290 µs">
<rect class="nj-heat-4" x="501" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="318" text-anchor="middle">5.01</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · minify&#10;5.25× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 4,081 µs&#10;citm_catalog.json: 6,880 µs&#10;canada.json: 17,249 µs&#10;jeopardy.json: 615,033 µs">
<rect class="nj-heat-4" x="593" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="318" text-anchor="middle">5.25</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · write&#10;2.19× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 563 µs&#10;citm_catalog.json: 882 µs&#10;canada.json: 3,979 µs&#10;jeopardy.json: 120,716 µs">
<rect class="nj-heat-2" x="685" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="318" text-anchor="middle">2.19</text>
</g>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="354" text-anchor="end">nlohmann/json json</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · validate&#10;1.94× the time of the fastest library (fully validating)&#10;way: accept&#10;twitter.json: 746 µs&#10;citm_catalog.json: 1,424 µs&#10;canada.json: 4,201 µs&#10;jeopardy.json: 100,878 µs">
<rect class="nj-heat-2" x="225" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="354" text-anchor="middle">1.94</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · sum&#10;1.49× the time of the fastest library (fully validating)&#10;way: sax&#10;twitter.json: 784 µs&#10;citm_catalog.json: 1,466 µs&#10;canada.json: 5,345 µs&#10;jeopardy.json: 101,437 µs">
<rect class="nj-heat-1" x="317" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="354" text-anchor="middle">1.49</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · select&#10;7.92× the time of the fastest library (fully validating)&#10;twitter.json: 3,654 µs · parse&#10;citm_catalog.json: 5,494 µs · parse&#10;canada.json: 11,583 µs · structs (from_json)&#10;jeopardy.json: 641,176 µs · structs (from_json)">
<rect class="nj-heat-4" x="409" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="354" text-anchor="middle">7.92</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · edit&#10;4.24× the time of the fastest library (fully validating)&#10;twitter.json: 3,058 µs · ordered_json&#10;citm_catalog.json: 5,099 µs · ordered_json&#10;canada.json: 16,378 µs · parse&#10;jeopardy.json: 920,570 µs · ordered_json">
<rect class="nj-heat-3" x="501" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="354" text-anchor="middle">4.24</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · minify&#10;5.30× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 4,037 µs&#10;citm_catalog.json: 6,081 µs&#10;canada.json: 16,349 µs&#10;jeopardy.json: 771,912 µs">
<rect class="nj-heat-4" x="593" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="354" text-anchor="middle">5.30</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · write&#10;1.92× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 445 µs&#10;citm_catalog.json: 590 µs&#10;canada.json: 4,523 µs&#10;jeopardy.json: 118,446 µs">
<rect class="nj-heat-2" x="685" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="354" text-anchor="middle">1.92</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="390" text-anchor="end">Glaze</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · validate&#10;1.40× the time of the fastest library (fully validating)&#10;way: validate_json&#10;twitter.json: 621 µs&#10;citm_catalog.json: 1,402 µs&#10;canada.json: 1,806 µs&#10;jeopardy.json: 76,164 µs">
<rect class="nj-heat-1" x="225" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="390" text-anchor="middle">1.40</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum&#10;7.35× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 3,890 µs&#10;citm_catalog.json: 7,282 µs&#10;canada.json: 25,798 µs&#10;jeopardy.json: 501,805 µs">
<rect class="nj-heat-4" x="317" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="390" text-anchor="middle">7.35</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum, checking less&#10;5.04× the time of the fastest fully validating library&#10;twitter.json: 2,829 µs · lazy_json&#10;citm_catalog.json: 7,282 µs · generic (validates fully)&#10;canada.json: 17,578 µs · lazy_json&#10;jeopardy.json: 223,672 µs · lazy_json&#10;reads lazily: lazy_json reads only what you ask for and steps over the rest">
<rect class="nj-heat-4" x="363" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="384" text-anchor="middle">5.04</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="397" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select&#10;1.35× the time of the fastest library (fully validating)&#10;way: structs (validate_skipped)&#10;twitter.json: 560 µs&#10;citm_catalog.json: 1,329 µs&#10;canada.json: 1,780 µs&#10;jeopardy.json: 93,674 µs">
<rect class="nj-heat-1" x="409" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="390" text-anchor="middle">1.35</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select, checking less&#10;0.61× the time of the fastest fully validating library&#10;way: structs&#10;twitter.json: 345 µs&#10;citm_catalog.json: 424 µs&#10;canada.json: 463 µs&#10;jeopardy.json: 76,186 µs&#10;reads into structs and steps over fields it doesn&#x27;t know without checking them (validate_skipped checks them too)">
<rect class="nj-heat-0" x="455" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="384" text-anchor="middle">0.61</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="397" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · edit&#10;6.32× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 4,278 µs&#10;citm_catalog.json: 7,989 µs&#10;canada.json: 30,869 µs&#10;jeopardy.json: 1,095,800 µs">
<rect class="nj-heat-4" x="501" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="390" text-anchor="middle">6.32</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify&#10;6.39× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 4,215 µs&#10;citm_catalog.json: 7,644 µs&#10;canada.json: 29,762 µs&#10;jeopardy.json: 683,744 µs">
<rect class="nj-heat-4" x="593" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="390" text-anchor="middle">6.39</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify, checking less&#10;0.69× the time of the fastest fully validating library&#10;way: minify_json&#10;twitter.json: 418 µs&#10;citm_catalog.json: 1,062 µs&#10;canada.json: 2,150 µs&#10;jeopardy.json: 93,265 µs&#10;minify_json only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="384" text-anchor="middle">0.69</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="397" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · write&#10;2.03× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 413 µs&#10;citm_catalog.json: 725 µs&#10;canada.json: 4,239 µs&#10;jeopardy.json: 137,011 µs">
<rect class="nj-heat-2" x="685" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="390" text-anchor="middle">2.03</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="426" text-anchor="end">RapidJSON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate&#10;4.31× the time of the fastest library (fully validating)&#10;twitter.json: 1,845 µs · insitu (copy)&#10;citm_catalog.json: 2,150 µs · S&#8203;AX&#10;canada.json: 11,719 µs · S&#8203;AX&#10;jeopardy.json: 233,417 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="225" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="426" text-anchor="middle">4.31</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate, checking less&#10;3.29× the time of the fastest fully validating library&#10;twitter.json: 1,227 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,665 µs · S&#8203;AX (no encoding check)&#10;canada.json: 11,601 µs · S&#8203;AX (no encoding check)&#10;jeopardy.json: 156,744 µs · S&#8203;AX (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="271" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="420" text-anchor="middle">3.29</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum&#10;3.16× the time of the fastest library (fully validating)&#10;twitter.json: 1,869 µs · insitu (copy)&#10;citm_catalog.json: 2,172 µs · S&#8203;AX&#10;canada.json: 12,183 µs · S&#8203;AX&#10;jeopardy.json: 253,075 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="317" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="426" text-anchor="middle">3.16</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum, checking less&#10;2.42× the time of the fastest fully validating library&#10;twitter.json: 1,237 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,770 µs · S&#8203;AX (no encoding check)&#10;canada.json: 12,082 µs · insitu (copy) (no encoding check)&#10;jeopardy.json: 163,826 µs · S&#8203;AX (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="363" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="420" text-anchor="middle">2.42</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select&#10;4.32× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,901 µs&#10;citm_catalog.json: 2,329 µs&#10;canada.json: 11,814 µs&#10;jeopardy.json: 251,223 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="409" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="426" text-anchor="middle">4.32</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select, checking less&#10;3.40× the time of the fastest fully validating library&#10;way: insitu (copy) (no encoding check)&#10;twitter.json: 1,251 µs&#10;citm_catalog.json: 1,936 µs&#10;canada.json: 11,565 µs&#10;jeopardy.json: 181,144 µs&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="455" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="420" text-anchor="middle">3.40</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit&#10;3.16× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 2,565 µs&#10;citm_catalog.json: 3,328 µs&#10;canada.json: 22,449 µs&#10;jeopardy.json: 378,036 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="523.5" y="426" text-anchor="middle">3.16</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit, checking less&#10;2.69× the time of the fastest fully validating library&#10;way: insitu (copy) (no encoding check)&#10;twitter.json: 1,902 µs&#10;citm_catalog.json: 2,859 µs&#10;canada.json: 21,667 µs&#10;jeopardy.json: 321,177 µs&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="547" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="568.5" y="420" text-anchor="middle">2.69</text>
<text class="nj-charts-cell nj-charts-cell--small" x="568.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify&#10;3.48× the time of the fastest library (fully validating)&#10;twitter.json: 2,465 µs · S&#8203;AX to Writer&#10;citm_catalog.json: 2,829 µs · S&#8203;AX to Writer&#10;canada.json: 22,132 µs · Document + Writer&#10;jeopardy.json: 374,258 µs · S&#8203;AX to Writer">
<rect class="nj-heat-3" x="593" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="426" text-anchor="middle">3.48</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify, checking less&#10;2.90× the time of the fastest fully validating library&#10;twitter.json: 1,928 µs · S&#8203;AX to Writer (no encoding check)&#10;citm_catalog.json: 2,416 µs · S&#8203;AX to Writer (no encoding check)&#10;canada.json: 22,132 µs · Document + Writer (validates fully)&#10;jeopardy.json: 269,637 µs · S&#8203;AX to Writer (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)">
<rect class="nj-heat-3" x="639" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="420" text-anchor="middle">2.90</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · write&#10;2.93× the time of the fastest library (fully validating)&#10;way: Writer&#10;twitter.json: 644 µs&#10;citm_catalog.json: 966 µs&#10;canada.json: 9,614 µs&#10;jeopardy.json: 127,167 µs">
<rect class="nj-heat-3" x="685" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="426" text-anchor="middle">2.93</text>
</g>
<text class="nj-charts-tick nj-charts-tick--l" x="8" y="472">time relative to the fastest fully validating library, less is better</text>
<g><rect class="nj-heat-0" x="8" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="46" y="496" text-anchor="middle">below 1.15</text></g>
<g><rect class="nj-heat-1" x="88" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="126" y="496" text-anchor="middle">1.15 to 1.5</text></g>
<g><rect class="nj-heat-2" x="168" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="206" y="496" text-anchor="middle">1.5 to 2.5</text></g>
<g><rect class="nj-heat-3" x="248" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="286" y="496" text-anchor="middle">2.5 to 5</text></g>
<g><rect class="nj-heat-4" x="328" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="366" y="496" text-anchor="middle">5 and more</text></g>
<rect class="nj-heat-na" x="420" y="482" width="40" height="20" rx="3"/>
<text class="nj-charts-tick" x="440" y="496">n/a</text>
<text class="nj-charts-tick nj-charts-tick--l" x="468" y="496">no A&#8203;PI for it</text>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

@@ -0,0 +1,359 @@
<svg class="nj-fig nj-charts nj-charts--blog nj-charts--heat" viewBox="0 0 784 510" role="img" aria-labelledby="nj-blog-uc-x86-gcc nj-blog-uc-x86-gcc-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-uc-x86-gcc">Use cases: time of each library relative to the fastest, x86-64 with G&#8203;CC 16.2</title>
<desc id="nj-blog-uc-x86-gcc-d">Table of relative times, libraries by use case. nlohmann/json json_document validate: 1.00; nlohmann/json json_document sum: 1.10; nlohmann/json json_document select: 1.00; nlohmann/json json_document edit: 1.00; nlohmann/json json_document minify: 1.00; nlohmann/json json_document write: 1.00; yyjson validate: 1.53; yyjson sum: 1.32; yyjson select: 1.47; yyjson edit: 1.45; yyjson minify: 1.28; yyjson write: 1.07; sonic-rs (Rust) validate: 1.17; sonic-rs (Rust) sum: 1.15; sonic-rs (Rust) select: 1.31; sonic-rs (Rust) edit: 1.92; sonic-rs (Rust) minify: 1.67; sonic-rs (Rust) write: 1.98; simdjson validate: 1.27; simdjson sum: 1.00; simdjson select: 1.26 (0.62 checking less, partial); simdjson edit: n/a; simdjson minify: 1.87 (0.18 checking less, partial); simdjson write: 2.84; sonic-cpp validate: no fully validating way (1.41 checking less, no U&#8203;TF-8); sonic-cpp sum: no fully validating way (1.25 checking less, no U&#8203;TF-8); sonic-cpp select: no fully validating way (1.36 checking less, no U&#8203;TF-8); sonic-cpp edit: no fully validating way (1.21 checking less, no U&#8203;TF-8); sonic-cpp minify: no fully validating way (1.34 checking less, no U&#8203;TF-8); sonic-cpp write: 1.50; Boost.J&#8203;SON validate: 1.67; Boost.J&#8203;SON sum: 1.26; Boost.J&#8203;SON select: 3.04; Boost.J&#8203;SON edit: 2.24; Boost.J&#8203;SON minify: 2.57; Boost.J&#8203;SON write: 2.25; simd-json (Rust) validate: 2.26; simd-json (Rust) sum: 1.99; simd-json (Rust) select: 2.52; simd-json (Rust) edit: 3.09; simd-json (Rust) minify: 3.31; simd-json (Rust) write: 2.22; serde_json (Rust) validate: 1.49 (1.33 checking less, no U&#8203;TF-8); serde_json (Rust) sum: 2.38; serde_json (Rust) select: 1.67; serde_json (Rust) edit: 5.07; serde_json (Rust) minify: 5.07; serde_json (Rust) write: 2.17; RapidJSON validate: 3.34 (3.06 checking less, no U&#8203;TF-8); RapidJSON sum: 2.70 (2.46 checking less, no U&#8203;TF-8); RapidJSON select: 3.27 (3.10 checking less, no U&#8203;TF-8); RapidJSON edit: 2.64 (2.54 checking less, no U&#8203;TF-8); RapidJSON minify: 3.37 (2.78 checking less, no U&#8203;TF-8); RapidJSON write: 2.95; Glaze validate: 1.76; Glaze sum: 5.98 (5.38 checking less, partial); Glaze select: 1.71 (0.59 checking less, partial); Glaze edit: 5.05; Glaze minify: 4.82 (0.75 checking less, partial); Glaze write: 1.90; nlohmann/json json validate: 2.06; nlohmann/json json sum: 1.67; nlohmann/json json select: 7.98; nlohmann/json json edit: 4.16; nlohmann/json json minify: 5.23; nlohmann/json json write: 1.87.</desc>
<text class="nj-charts-tick" x="270" y="34">validate</text>
<text class="nj-charts-tick" x="362" y="34">sum</text>
<text class="nj-charts-tick" x="454" y="34">select</text>
<text class="nj-charts-tick" x="546" y="34">edit</text>
<text class="nj-charts-tick" x="638" y="34">minify</text>
<text class="nj-charts-tick" x="730" y="34">write</text>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="66" text-anchor="end">nlohmann/json json_document</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · validate&#10;1.00× the time of the fastest library (fully validating)&#10;twitter.json: 304 µs · parse&#10;citm_catalog.json: 733 µs · parse&#10;canada.json: 1,682 µs · accept&#10;jeopardy.json: 78,594 µs · parse">
<rect class="nj-heat-0" x="225" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · sum&#10;1.10× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 383 µs&#10;citm_catalog.json: 932 µs&#10;canada.json: 3,874 µs&#10;jeopardy.json: 93,197 µs">
<rect class="nj-heat-0" x="317" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="66" text-anchor="middle">1.10</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · select&#10;1.00× the time of the fastest library (fully validating)&#10;twitter.json: 325 µs · structs (from_json)&#10;citm_catalog.json: 784 µs · structs (from_json)&#10;canada.json: 1,686 µs · parse&#10;jeopardy.json: 91,622 µs · parse">
<rect class="nj-heat-0" x="409" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · edit&#10;1.00× the time of the fastest library (fully validating)&#10;way: editable&#10;twitter.json: 552 µs&#10;citm_catalog.json: 1,082 µs&#10;canada.json: 5,801 µs&#10;jeopardy.json: 198,867 µs">
<rect class="nj-heat-0" x="501" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · minify&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 482 µs&#10;citm_catalog.json: 1,001 µs&#10;canada.json: 5,856 µs&#10;jeopardy.json: 159,533 µs">
<rect class="nj-heat-0" x="593" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · write&#10;1.00× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 155 µs&#10;citm_catalog.json: 253 µs&#10;canada.json: 3,899 µs&#10;jeopardy.json: 69,593 µs">
<rect class="nj-heat-0" x="685" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="66" text-anchor="middle">1.00</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="102" text-anchor="end">yyjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · validate&#10;1.53× the time of the fastest library (fully validating)&#10;twitter.json: 394 µs · insitu (copy)&#10;citm_catalog.json: 956 µs · read&#10;canada.json: 3,322 µs · insitu (copy)&#10;jeopardy.json: 130,978 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="225" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="102" text-anchor="middle">1.53</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · sum&#10;1.32× the time of the fastest library (fully validating)&#10;twitter.json: 448 µs · insitu (copy)&#10;citm_catalog.json: 1,094 µs · insitu (copy)&#10;canada.json: 3,955 µs · insitu (copy)&#10;jeopardy.json: 136,684 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="317" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="102" text-anchor="middle">1.32</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · select&#10;1.47× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 403 µs&#10;citm_catalog.json: 1,011 µs&#10;canada.json: 3,268 µs&#10;jeopardy.json: 139,623 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="409" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="102" text-anchor="middle">1.47</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · edit&#10;1.45× the time of the fastest library (fully validating)&#10;twitter.json: 801 µs · insitu (copy) + mut copy&#10;citm_catalog.json: 1,641 µs · mut copy&#10;canada.json: 7,402 µs · mut copy&#10;jeopardy.json: 313,182 µs · insitu (copy) + mut copy&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="501" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="102" text-anchor="middle">1.45</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · minify&#10;1.28× the time of the fastest library (fully validating)&#10;twitter.json: 658 µs · read + write&#10;citm_catalog.json: 1,268 µs · insitu (copy) + write&#10;canada.json: 6,934 µs · insitu (copy) + write&#10;jeopardy.json: 210,677 µs · insitu (copy) + write&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="593" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="102" text-anchor="middle">1.28</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · write&#10;1.07× the time of the fastest library (fully validating)&#10;way: write&#10;twitter.json: 190 µs&#10;citm_catalog.json: 320 µs&#10;canada.json: 3,349 µs&#10;jeopardy.json: 69,582 µs">
<rect class="nj-heat-0" x="685" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="102" text-anchor="middle">1.07</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="138" text-anchor="end">sonic-rs (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · validate&#10;1.17× the time of the fastest library (fully validating)&#10;way: IgnoredAny&#10;twitter.json: 470 µs&#10;citm_catalog.json: 966 µs&#10;canada.json: 2,249 µs&#10;jeopardy.json: 54,246 µs">
<rect class="nj-heat-1" x="225" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="138" text-anchor="middle">1.17</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · sum&#10;1.15× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 494 µs&#10;citm_catalog.json: 1,135 µs&#10;canada.json: 4,580 µs&#10;jeopardy.json: 59,149 µs">
<rect class="nj-heat-0" x="317" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="138" text-anchor="middle">1.15</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · select&#10;1.31× the time of the fastest library (fully validating)&#10;way: structs&#10;twitter.json: 557 µs&#10;citm_catalog.json: 1,023 µs&#10;canada.json: 2,247 µs&#10;jeopardy.json: 91,996 µs">
<rect class="nj-heat-1" x="409" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="138" text-anchor="middle">1.31</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · edit&#10;1.92× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 1,189 µs&#10;citm_catalog.json: 2,384 µs&#10;canada.json: 8,007 µs&#10;jeopardy.json: 413,714 µs">
<rect class="nj-heat-2" x="501" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="138" text-anchor="middle">1.92</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · minify&#10;1.67× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 988 µs&#10;citm_catalog.json: 2,093 µs&#10;canada.json: 7,775 µs&#10;jeopardy.json: 217,697 µs">
<rect class="nj-heat-2" x="593" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="138" text-anchor="middle">1.67</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · write&#10;1.98× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 442 µs&#10;citm_catalog.json: 935 µs&#10;canada.json: 3,954 µs&#10;jeopardy.json: 100,889 µs">
<rect class="nj-heat-2" x="685" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="138" text-anchor="middle">1.98</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="174" text-anchor="end">simdjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · validate&#10;1.27× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 302 µs&#10;citm_catalog.json: 705 µs&#10;canada.json: 3,176 µs&#10;jeopardy.json: 114,180 µs">
<rect class="nj-heat-1" x="225" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="174" text-anchor="middle">1.27</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · sum&#10;1.00× the time of the fastest library (fully validating)&#10;way: On-Demand&#10;twitter.json: 347 µs&#10;citm_catalog.json: 796 µs&#10;canada.json: 3,476 µs&#10;jeopardy.json: 92,000 µs">
<rect class="nj-heat-0" x="317" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="174" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select&#10;1.26× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 315 µs&#10;citm_catalog.json: 754 µs&#10;canada.json: 3,190 µs&#10;jeopardy.json: 129,838 µs">
<rect class="nj-heat-1" x="409" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="174" text-anchor="middle">1.26</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select, checking less&#10;0.62× the time of the fastest fully validating library&#10;way: On-Demand&#10;twitter.json: 202 µs&#10;citm_catalog.json: 642 µs&#10;canada.json: 907 µs&#10;jeopardy.json: 50,352 µs&#10;reads lazily: On-Demand reads only what you ask for and steps over the rest by matching brackets">
<rect class="nj-heat-0" x="455" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="168" text-anchor="middle">0.62</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · edit&#10;simdjson&#x27;s documents are read-only: it has no A&#8203;PI to change a value and write the result">
<rect class="nj-heat-na" x="501" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-tick" x="546" y="174">n/a</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify&#10;1.87× the time of the fastest library (fully validating)&#10;way: D&#8203;OM + to_string&#10;twitter.json: 799 µs&#10;citm_catalog.json: 1,461 µs&#10;canada.json: 15,173 µs&#10;jeopardy.json: 310,524 µs">
<rect class="nj-heat-2" x="593" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="174" text-anchor="middle">1.87</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify, checking less&#10;0.18× the time of the fastest fully validating library&#10;way: minify&#10;twitter.json: 104 µs&#10;citm_catalog.json: 246 µs&#10;canada.json: 365 µs&#10;jeopardy.json: 47,397 µs&#10;simdjson::minify() only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="168" text-anchor="middle">0.18</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · write&#10;2.84× the time of the fastest library (fully validating)&#10;way: to_string&#10;twitter.json: 471 µs&#10;citm_catalog.json: 712 µs&#10;canada.json: 11,156 µs&#10;jeopardy.json: 186,861 µs">
<rect class="nj-heat-3" x="685" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="174" text-anchor="middle">2.84</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="210" text-anchor="end">sonic-cpp</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · validate, checking less&#10;1.41× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 405 µs&#10;citm_catalog.json: 935 µs&#10;canada.json: 3,218 µs&#10;jeopardy.json: 95,565 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="225" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="204" text-anchor="middle">1.41</text>
<text class="nj-charts-cell nj-charts-cell--small" x="270" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · sum, checking less&#10;1.25× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 462 µs&#10;citm_catalog.json: 1,125 µs&#10;canada.json: 3,867 µs&#10;jeopardy.json: 106,727 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="317" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="204" text-anchor="middle">1.25</text>
<text class="nj-charts-cell nj-charts-cell--small" x="362" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · select, checking less&#10;1.36× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 410 µs&#10;citm_catalog.json: 952 µs&#10;canada.json: 3,249 µs&#10;jeopardy.json: 106,866 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="409" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="204" text-anchor="middle">1.36</text>
<text class="nj-charts-cell nj-charts-cell--small" x="454" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · edit, checking less&#10;1.21× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 629 µs&#10;citm_catalog.json: 1,455 µs&#10;canada.json: 8,594 µs&#10;jeopardy.json: 185,870 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="501" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="204" text-anchor="middle">1.21</text>
<text class="nj-charts-cell nj-charts-cell--small" x="546" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · minify, checking less&#10;1.34× the time of the fastest fully validating library&#10;way: Document + Serialize&#10;twitter.json: 633 µs&#10;citm_catalog.json: 1,436 µs&#10;canada.json: 8,992 µs&#10;jeopardy.json: 178,113 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="593" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="204" text-anchor="middle">1.34</text>
<text class="nj-charts-cell nj-charts-cell--small" x="638" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · write&#10;1.50× the time of the fastest library (fully validating)&#10;way: Serialize&#10;twitter.json: 259 µs&#10;citm_catalog.json: 510 µs&#10;canada.json: 5,269 µs&#10;jeopardy.json: 76,584 µs">
<rect class="nj-heat-1" x="685" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="210" text-anchor="middle">1.50</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="246" text-anchor="end">Boost.J&#8203;SON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · validate&#10;1.67× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 680 µs&#10;citm_catalog.json: 922 µs&#10;canada.json: 5,993 µs&#10;jeopardy.json: 60,687 µs">
<rect class="nj-heat-2" x="225" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="246" text-anchor="middle">1.67</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · sum&#10;1.26× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 668 µs&#10;citm_catalog.json: 934 µs&#10;canada.json: 5,692 µs&#10;jeopardy.json: 62,486 µs">
<rect class="nj-heat-1" x="317" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="246" text-anchor="middle">1.26</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · select&#10;3.04× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 1,326 µs&#10;citm_catalog.json: 1,871 µs&#10;canada.json: 6,892 µs&#10;jeopardy.json: 196,136 µs">
<rect class="nj-heat-3" x="409" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="246" text-anchor="middle">3.04</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · edit&#10;2.24× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 1,771 µs&#10;citm_catalog.json: 2,496 µs&#10;canada.json: 12,504 µs&#10;jeopardy.json: 311,015 µs">
<rect class="nj-heat-2" x="501" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="246" text-anchor="middle">2.24</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · minify&#10;2.57× the time of the fastest library (fully validating)&#10;way: parse + serialize&#10;twitter.json: 1,803 µs&#10;citm_catalog.json: 2,480 µs&#10;canada.json: 13,545 µs&#10;jeopardy.json: 324,721 µs">
<rect class="nj-heat-3" x="593" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="246" text-anchor="middle">2.57</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · write&#10;2.25× the time of the fastest library (fully validating)&#10;way: serialize&#10;twitter.json: 454 µs&#10;citm_catalog.json: 835 µs&#10;canada.json: 5,468 µs&#10;jeopardy.json: 132,656 µs">
<rect class="nj-heat-2" x="685" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="246" text-anchor="middle">2.25</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="282" text-anchor="end">simd-json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · validate&#10;2.26× the time of the fastest library (fully validating)&#10;way: tape (copy)&#10;twitter.json: 592 µs&#10;citm_catalog.json: 1,426 µs&#10;canada.json: 4,303 µs&#10;jeopardy.json: 211,716 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="225" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="282" text-anchor="middle">2.26</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · sum&#10;1.99× the time of the fastest library (fully validating)&#10;way: visitor (copy)&#10;twitter.json: 722 µs&#10;citm_catalog.json: 1,686 µs&#10;canada.json: 5,191 µs&#10;jeopardy.json: 220,582 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="317" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="282" text-anchor="middle">1.99</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · select&#10;2.52× the time of the fastest library (fully validating)&#10;way: structs (copy)&#10;twitter.json: 730 µs&#10;citm_catalog.json: 1,658 µs&#10;canada.json: 4,915 µs&#10;jeopardy.json: 266,073 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="409" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="282" text-anchor="middle">2.52</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · edit&#10;3.09× the time of the fastest library (fully validating)&#10;twitter.json: 2,071 µs · borrowed (copy)&#10;citm_catalog.json: 4,465 µs · borrowed (copy)&#10;canada.json: 16,360 µs · owned (copy)&#10;jeopardy.json: 416,658 µs · borrowed (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="282" text-anchor="middle">3.09</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · minify&#10;3.31× the time of the fastest library (fully validating)&#10;way: borrowed (copy)&#10;twitter.json: 1,924 µs&#10;citm_catalog.json: 4,375 µs&#10;canada.json: 15,278 µs&#10;jeopardy.json: 419,474 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="593" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="282" text-anchor="middle">3.31</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · write&#10;2.22× the time of the fastest library (fully validating)&#10;way: borrowed&#10;twitter.json: 604 µs&#10;citm_catalog.json: 809 µs&#10;canada.json: 4,825 µs&#10;jeopardy.json: 110,710 µs">
<rect class="nj-heat-2" x="685" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="282" text-anchor="middle">2.22</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="318" text-anchor="end">serde_json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate&#10;1.49× the time of the fastest library (fully validating)&#10;way: from_utf8 + IgnoredAny&#10;twitter.json: 634 µs&#10;citm_catalog.json: 1,448 µs&#10;canada.json: 2,402 µs&#10;jeopardy.json: 66,822 µs">
<rect class="nj-heat-1" x="225" y="297" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="318" text-anchor="middle">1.49</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate, checking less&#10;1.33× the time of the fastest fully validating library&#10;way: IgnoredAny&#10;twitter.json: 487 µs&#10;citm_catalog.json: 1,370 µs&#10;canada.json: 2,318 µs&#10;jeopardy.json: 59,801 µs&#10;trusts U&#8203;TF-8 in the strings it skips (from_slice); strings it reads are checked">
<rect class="nj-heat-1" x="271" y="297" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="312" text-anchor="middle">1.33</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="325" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · sum&#10;2.38× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 1,318 µs&#10;citm_catalog.json: 2,299 µs&#10;canada.json: 7,610 µs&#10;jeopardy.json: 123,810 µs">
<rect class="nj-heat-2" x="317" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="318" text-anchor="middle">2.38</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · select&#10;1.67× the time of the fastest library (fully validating)&#10;way: from_utf8 + structs&#10;twitter.json: 769 µs&#10;citm_catalog.json: 1,504 µs&#10;canada.json: 2,442 µs&#10;jeopardy.json: 108,386 µs">
<rect class="nj-heat-2" x="409" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="318" text-anchor="middle">1.67</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · edit&#10;5.07× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 4,474 µs&#10;citm_catalog.json: 6,922 µs&#10;canada.json: 18,301 µs&#10;jeopardy.json: 805,290 µs">
<rect class="nj-heat-4" x="501" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="318" text-anchor="middle">5.07</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · minify&#10;5.07× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 4,081 µs&#10;citm_catalog.json: 6,880 µs&#10;canada.json: 17,249 µs&#10;jeopardy.json: 615,033 µs">
<rect class="nj-heat-4" x="593" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="318" text-anchor="middle">5.07</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · write&#10;2.17× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 563 µs&#10;citm_catalog.json: 882 µs&#10;canada.json: 3,979 µs&#10;jeopardy.json: 120,716 µs">
<rect class="nj-heat-2" x="685" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="318" text-anchor="middle">2.17</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="354" text-anchor="end">RapidJSON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate&#10;3.34× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,250 µs&#10;citm_catalog.json: 1,910 µs&#10;canada.json: 10,181 µs&#10;jeopardy.json: 150,241 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="225" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="354" text-anchor="middle">3.34</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate, checking less&#10;3.06× the time of the fastest fully validating library&#10;twitter.json: 1,098 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,607 µs · S&#8203;AX (no encoding check)&#10;canada.json: 10,181 µs · insitu (copy) (validates fully)&#10;jeopardy.json: 143,546 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="271" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="348" text-anchor="middle">3.06</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum&#10;2.70× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,296 µs&#10;citm_catalog.json: 2,011 µs&#10;canada.json: 10,601 µs&#10;jeopardy.json: 170,083 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="317" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="354" text-anchor="middle">2.70</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum, checking less&#10;2.46× the time of the fastest fully validating library&#10;twitter.json: 1,145 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,688 µs · S&#8203;AX (no encoding check)&#10;canada.json: 10,601 µs · insitu (copy) (validates fully)&#10;jeopardy.json: 157,809 µs · S&#8203;AX (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="363" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="348" text-anchor="middle">2.46</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select&#10;3.27× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,274 µs&#10;citm_catalog.json: 2,060 µs&#10;canada.json: 10,432 µs&#10;jeopardy.json: 165,343 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="409" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="354" text-anchor="middle">3.27</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select, checking less&#10;3.10× the time of the fastest fully validating library&#10;twitter.json: 1,098 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 2,034 µs · Document (no encoding check)&#10;canada.json: 10,432 µs · insitu (copy) (validates fully)&#10;jeopardy.json: 156,012 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="455" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="348" text-anchor="middle">3.10</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit&#10;2.64× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 1,983 µs&#10;citm_catalog.json: 2,859 µs&#10;canada.json: 19,769 µs&#10;jeopardy.json: 298,015 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="523.5" y="354" text-anchor="middle">2.64</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit, checking less&#10;2.54× the time of the fastest fully validating library&#10;twitter.json: 1,799 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 2,859 µs · insitu (copy) (validates fully)&#10;canada.json: 19,394 µs · insitu (copy) (no encoding check)&#10;jeopardy.json: 286,231 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="547" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="568.5" y="348" text-anchor="middle">2.54</text>
<text class="nj-charts-cell nj-charts-cell--small" x="568.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify&#10;3.37× the time of the fastest library (fully validating)&#10;twitter.json: 2,606 µs · S&#8203;AX to Writer&#10;citm_catalog.json: 2,810 µs · S&#8203;AX to Writer&#10;canada.json: 22,160 µs · Document + Writer&#10;jeopardy.json: 360,474 µs · S&#8203;AX to Writer">
<rect class="nj-heat-3" x="593" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="354" text-anchor="middle">3.37</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify, checking less&#10;2.78× the time of the fastest fully validating library&#10;way: S&#8203;AX to Writer (no encoding check)&#10;twitter.json: 1,820 µs&#10;citm_catalog.json: 2,456 µs&#10;canada.json: 21,770 µs&#10;jeopardy.json: 277,281 µs&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)">
<rect class="nj-heat-3" x="639" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="348" text-anchor="middle">2.78</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="361" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · write&#10;2.95× the time of the fastest library (fully validating)&#10;way: Writer&#10;twitter.json: 653 µs&#10;citm_catalog.json: 978 µs&#10;canada.json: 9,071 µs&#10;jeopardy.json: 138,832 µs">
<rect class="nj-heat-3" x="685" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="354" text-anchor="middle">2.95</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="390" text-anchor="end">Glaze</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · validate&#10;1.76× the time of the fastest library (fully validating)&#10;way: validate_json&#10;twitter.json: 727 µs&#10;citm_catalog.json: 1,983 µs&#10;canada.json: 2,571 µs&#10;jeopardy.json: 76,361 µs">
<rect class="nj-heat-2" x="225" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="390" text-anchor="middle">1.76</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum&#10;5.98× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 2,940 µs&#10;citm_catalog.json: 5,528 µs&#10;canada.json: 17,830 µs&#10;jeopardy.json: 390,814 µs">
<rect class="nj-heat-4" x="317" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="390" text-anchor="middle">5.98</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum, checking less&#10;5.38× the time of the fastest fully validating library&#10;twitter.json: 2,940 µs · generic (validates fully)&#10;citm_catalog.json: 5,528 µs · generic (validates fully)&#10;canada.json: 17,830 µs · generic (validates fully)&#10;jeopardy.json: 255,217 µs · lazy_json&#10;reads lazily: lazy_json reads only what you ask for and steps over the rest">
<rect class="nj-heat-4" x="363" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="384" text-anchor="middle">5.38</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="397" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select&#10;1.71× the time of the fastest library (fully validating)&#10;way: structs (validate_skipped)&#10;twitter.json: 619 µs&#10;citm_catalog.json: 2,238 µs&#10;canada.json: 2,544 µs&#10;jeopardy.json: 96,608 µs">
<rect class="nj-heat-2" x="409" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="390" text-anchor="middle">1.71</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select, checking less&#10;0.59× the time of the fastest fully validating library&#10;way: structs&#10;twitter.json: 360 µs&#10;citm_catalog.json: 412 µs&#10;canada.json: 433 µs&#10;jeopardy.json: 74,849 µs&#10;reads into structs and steps over fields it doesn&#x27;t know without checking them (validate_skipped checks them too)">
<rect class="nj-heat-0" x="455" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="384" text-anchor="middle">0.59</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="397" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · edit&#10;5.05× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 3,547 µs&#10;citm_catalog.json: 6,080 µs&#10;canada.json: 22,146 µs&#10;jeopardy.json: 937,712 µs">
<rect class="nj-heat-4" x="501" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="390" text-anchor="middle">5.05</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify&#10;4.82× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 3,394 µs&#10;citm_catalog.json: 6,016 µs&#10;canada.json: 23,223 µs&#10;jeopardy.json: 512,061 µs">
<rect class="nj-heat-3" x="593" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="390" text-anchor="middle">4.82</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify, checking less&#10;0.75× the time of the fastest fully validating library&#10;way: minify_json&#10;twitter.json: 419 µs&#10;citm_catalog.json: 1,301 µs&#10;canada.json: 2,832 µs&#10;jeopardy.json: 92,190 µs&#10;minify_json only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="369" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="384" text-anchor="middle">0.75</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="397" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · write&#10;1.90× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 367 µs&#10;citm_catalog.json: 688 µs&#10;canada.json: 4,097 µs&#10;jeopardy.json: 134,165 µs">
<rect class="nj-heat-2" x="685" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="390" text-anchor="middle">1.90</text>
</g>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="426" text-anchor="end">nlohmann/json json</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · validate&#10;2.06× the time of the fastest library (fully validating)&#10;way: accept&#10;twitter.json: 817 µs&#10;citm_catalog.json: 1,614 µs&#10;canada.json: 4,402 µs&#10;jeopardy.json: 92,387 µs">
<rect class="nj-heat-2" x="225" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="426" text-anchor="middle">2.06</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · sum&#10;1.67× the time of the fastest library (fully validating)&#10;way: sax&#10;twitter.json: 790 µs&#10;citm_catalog.json: 1,624 µs&#10;canada.json: 5,671 µs&#10;jeopardy.json: 93,964 µs">
<rect class="nj-heat-2" x="317" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="426" text-anchor="middle">1.67</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · select&#10;7.98× the time of the fastest library (fully validating)&#10;twitter.json: 3,643 µs · structs (from_json)&#10;citm_catalog.json: 6,199 µs · structs (from_json)&#10;canada.json: 11,694 µs · structs (from_json)&#10;jeopardy.json: 605,646 µs · parse">
<rect class="nj-heat-4" x="409" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="426" text-anchor="middle">7.98</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · edit&#10;4.16× the time of the fastest library (fully validating)&#10;way: ordered_json&#10;twitter.json: 3,046 µs&#10;citm_catalog.json: 5,087 µs&#10;canada.json: 15,464 µs&#10;jeopardy.json: 863,465 µs">
<rect class="nj-heat-3" x="501" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="426" text-anchor="middle">4.16</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · minify&#10;5.23× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 4,168 µs&#10;citm_catalog.json: 6,253 µs&#10;canada.json: 16,656 µs&#10;jeopardy.json: 777,125 µs">
<rect class="nj-heat-4" x="593" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="426" text-anchor="middle">5.23</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · write&#10;1.87× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 433 µs&#10;citm_catalog.json: 607 µs&#10;canada.json: 3,896 µs&#10;jeopardy.json: 126,529 µs">
<rect class="nj-heat-2" x="685" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="426" text-anchor="middle">1.87</text>
</g>
<text class="nj-charts-tick nj-charts-tick--l" x="8" y="472">time relative to the fastest fully validating library, less is better</text>
<g><rect class="nj-heat-0" x="8" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="46" y="496" text-anchor="middle">below 1.15</text></g>
<g><rect class="nj-heat-1" x="88" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="126" y="496" text-anchor="middle">1.15 to 1.5</text></g>
<g><rect class="nj-heat-2" x="168" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="206" y="496" text-anchor="middle">1.5 to 2.5</text></g>
<g><rect class="nj-heat-3" x="248" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="286" y="496" text-anchor="middle">2.5 to 5</text></g>
<g><rect class="nj-heat-4" x="328" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="366" y="496" text-anchor="middle">5 and more</text></g>
<rect class="nj-heat-na" x="420" y="482" width="40" height="20" rx="3"/>
<text class="nj-charts-tick" x="440" y="496">n/a</text>
<text class="nj-charts-tick nj-charts-tick--l" x="468" y="496">no A&#8203;PI for it</text>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

@@ -0,0 +1,359 @@
<svg class="nj-fig nj-charts nj-charts--blog nj-charts--heat" viewBox="0 0 784 510" role="img" aria-labelledby="nj-blog-uc-x86-gcc13 nj-blog-uc-x86-gcc13-d" xmlns="http://www.w3.org/2000/svg">
<title id="nj-blog-uc-x86-gcc13">Use cases: time of each library relative to the fastest, x86-64 with G&#8203;CC 13</title>
<desc id="nj-blog-uc-x86-gcc13-d">Table of relative times, libraries by use case. nlohmann/json json_document validate: 1.00; nlohmann/json json_document sum: 1.11; nlohmann/json json_document select: 1.00; nlohmann/json json_document edit: 1.00; nlohmann/json json_document minify: 1.00; nlohmann/json json_document write: 1.00; yyjson validate: 1.68; yyjson sum: 1.47; yyjson select: 1.63; yyjson edit: 1.56; yyjson minify: 1.35; yyjson write: 1.14; sonic-rs (Rust) validate: 1.12; sonic-rs (Rust) sum: 1.14; sonic-rs (Rust) select: 1.28; sonic-rs (Rust) edit: 1.88; sonic-rs (Rust) minify: 1.65; sonic-rs (Rust) write: 1.94; simdjson validate: 1.31; simdjson sum: 1.00; simdjson select: 1.30 (0.69 checking less, partial); simdjson edit: n/a; simdjson minify: 1.86 (0.21 checking less, partial); simdjson write: 2.86; sonic-cpp validate: no fully validating way (1.45 checking less, no U&#8203;TF-8); sonic-cpp sum: no fully validating way (1.32 checking less, no U&#8203;TF-8); sonic-cpp select: no fully validating way (1.42 checking less, no U&#8203;TF-8); sonic-cpp edit: no fully validating way (1.22 checking less, no U&#8203;TF-8); sonic-cpp minify: no fully validating way (1.36 checking less, no U&#8203;TF-8); sonic-cpp write: 1.50; Boost.J&#8203;SON validate: 1.62; Boost.J&#8203;SON sum: 1.32; Boost.J&#8203;SON select: 3.26; Boost.J&#8203;SON edit: 2.44; Boost.J&#8203;SON minify: 2.70; Boost.J&#8203;SON write: 2.39; simd-json (Rust) validate: 2.17; simd-json (Rust) sum: 1.98; simd-json (Rust) select: 2.44; simd-json (Rust) edit: 3.03; simd-json (Rust) minify: 3.27; simd-json (Rust) write: 2.17; serde_json (Rust) validate: 1.43 (1.28 checking less, no U&#8203;TF-8); serde_json (Rust) sum: 2.37; serde_json (Rust) select: 1.62; serde_json (Rust) edit: 4.96; serde_json (Rust) minify: 5.01; serde_json (Rust) write: 2.12; Glaze validate: 1.33; Glaze sum: 6.46 (5.20 checking less, partial); Glaze select: 1.35 (0.58 checking less, partial); Glaze edit: 5.23; Glaze minify: 5.12 (0.70 checking less, partial); Glaze write: 1.92; nlohmann/json json validate: 2.00; nlohmann/json json sum: 1.73; nlohmann/json json select: 7.68; nlohmann/json json edit: 4.27; nlohmann/json json minify: 5.15; nlohmann/json json write: 1.88; RapidJSON validate: 3.97 (3.13 checking less, no U&#8203;TF-8); RapidJSON sum: 3.21 (2.54 checking less, no U&#8203;TF-8); RapidJSON select: 3.98 (3.24 checking less, no U&#8203;TF-8); RapidJSON edit: 3.02 (2.63 checking less, no U&#8203;TF-8); RapidJSON minify: 3.65 (2.79 checking less, no U&#8203;TF-8); RapidJSON write: 3.05.</desc>
<text class="nj-charts-tick" x="270" y="34">validate</text>
<text class="nj-charts-tick" x="362" y="34">sum</text>
<text class="nj-charts-tick" x="454" y="34">select</text>
<text class="nj-charts-tick" x="546" y="34">edit</text>
<text class="nj-charts-tick" x="638" y="34">minify</text>
<text class="nj-charts-tick" x="730" y="34">write</text>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="66" text-anchor="end">nlohmann/json json_document</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · validate&#10;1.00× the time of the fastest library (fully validating)&#10;twitter.json: 325 µs · parse&#10;citm_catalog.json: 742 µs · parse&#10;canada.json: 1,699 µs · accept&#10;jeopardy.json: 84,790 µs · accept">
<rect class="nj-heat-0" x="225" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · sum&#10;1.11× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 405 µs&#10;citm_catalog.json: 945 µs&#10;canada.json: 4,038 µs&#10;jeopardy.json: 87,781 µs">
<rect class="nj-heat-0" x="317" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="66" text-anchor="middle">1.11</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · select&#10;1.00× the time of the fastest library (fully validating)&#10;twitter.json: 347 µs · structs (from_json)&#10;citm_catalog.json: 763 µs · parse&#10;canada.json: 1,700 µs · parse&#10;jeopardy.json: 98,540 µs · parse">
<rect class="nj-heat-0" x="409" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · edit&#10;1.00× the time of the fastest library (fully validating)&#10;way: editable&#10;twitter.json: 552 µs&#10;citm_catalog.json: 1,112 µs&#10;canada.json: 6,027 µs&#10;jeopardy.json: 203,217 µs">
<rect class="nj-heat-0" x="501" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · minify&#10;1.00× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 497 µs&#10;citm_catalog.json: 1,028 µs&#10;canada.json: 5,930 µs&#10;jeopardy.json: 156,014 µs">
<rect class="nj-heat-0" x="593" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="66" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json_document · write&#10;1.00× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 153 µs&#10;citm_catalog.json: 271 µs&#10;canada.json: 3,934 µs&#10;jeopardy.json: 72,106 µs">
<rect class="nj-heat-0" x="685" y="45" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="66" text-anchor="middle">1.00</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="102" text-anchor="end">yyjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · validate&#10;1.68× the time of the fastest library (fully validating)&#10;twitter.json: 390 µs · insitu (copy)&#10;citm_catalog.json: 995 µs · insitu (copy)&#10;canada.json: 5,320 µs · read&#10;jeopardy.json: 132,598 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="225" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="102" text-anchor="middle">1.68</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · sum&#10;1.47× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 447 µs&#10;citm_catalog.json: 1,148 µs&#10;canada.json: 5,959 µs&#10;jeopardy.json: 138,001 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="317" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="102" text-anchor="middle">1.47</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · select&#10;1.63× the time of the fastest library (fully validating)&#10;twitter.json: 408 µs · insitu (copy)&#10;citm_catalog.json: 996 µs · insitu (copy)&#10;canada.json: 5,375 µs · insitu (copy)&#10;jeopardy.json: 142,713 µs · read&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="409" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="102" text-anchor="middle">1.63</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · edit&#10;1.56× the time of the fastest library (fully validating)&#10;twitter.json: 810 µs · insitu (copy) + mut copy&#10;citm_catalog.json: 1,724 µs · insitu (copy) + mut copy&#10;canada.json: 9,806 µs · mut copy&#10;jeopardy.json: 322,621 µs · insitu (copy) + mut copy&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="501" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="102" text-anchor="middle">1.56</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · minify&#10;1.35× the time of the fastest library (fully validating)&#10;twitter.json: 657 µs · insitu (copy) + write&#10;citm_catalog.json: 1,326 µs · read + write&#10;canada.json: 9,202 µs · insitu (copy) + write&#10;jeopardy.json: 195,618 µs · read + write&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-1" x="593" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="102" text-anchor="middle">1.35</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="yyjson · write&#10;1.14× the time of the fastest library (fully validating)&#10;way: write&#10;twitter.json: 216 µs&#10;citm_catalog.json: 331 µs&#10;canada.json: 3,620 µs&#10;jeopardy.json: 76,733 µs">
<rect class="nj-heat-0" x="685" y="81" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="102" text-anchor="middle">1.14</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="138" text-anchor="end">sonic-rs (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · validate&#10;1.12× the time of the fastest library (fully validating)&#10;way: IgnoredAny&#10;twitter.json: 470 µs&#10;citm_catalog.json: 966 µs&#10;canada.json: 2,249 µs&#10;jeopardy.json: 54,246 µs">
<rect class="nj-heat-0" x="225" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="138" text-anchor="middle">1.12</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · sum&#10;1.14× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 494 µs&#10;citm_catalog.json: 1,135 µs&#10;canada.json: 4,580 µs&#10;jeopardy.json: 59,149 µs">
<rect class="nj-heat-0" x="317" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="138" text-anchor="middle">1.14</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · select&#10;1.28× the time of the fastest library (fully validating)&#10;way: structs&#10;twitter.json: 557 µs&#10;citm_catalog.json: 1,023 µs&#10;canada.json: 2,247 µs&#10;jeopardy.json: 91,996 µs">
<rect class="nj-heat-1" x="409" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="138" text-anchor="middle">1.28</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · edit&#10;1.88× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 1,189 µs&#10;citm_catalog.json: 2,384 µs&#10;canada.json: 8,007 µs&#10;jeopardy.json: 413,714 µs">
<rect class="nj-heat-2" x="501" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="138" text-anchor="middle">1.88</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · minify&#10;1.65× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 988 µs&#10;citm_catalog.json: 2,093 µs&#10;canada.json: 7,775 µs&#10;jeopardy.json: 217,697 µs">
<rect class="nj-heat-2" x="593" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="138" text-anchor="middle">1.65</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-rs (Rust) · write&#10;1.94× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 442 µs&#10;citm_catalog.json: 935 µs&#10;canada.json: 3,954 µs&#10;jeopardy.json: 100,889 µs">
<rect class="nj-heat-2" x="685" y="117" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="138" text-anchor="middle">1.94</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="174" text-anchor="end">simdjson</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · validate&#10;1.31× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 328 µs&#10;citm_catalog.json: 810 µs&#10;canada.json: 3,178 µs&#10;jeopardy.json: 121,064 µs">
<rect class="nj-heat-1" x="225" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="174" text-anchor="middle">1.31</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · sum&#10;1.00× the time of the fastest library (fully validating)&#10;way: On-Demand&#10;twitter.json: 358 µs&#10;citm_catalog.json: 817 µs&#10;canada.json: 3,407 µs&#10;jeopardy.json: 90,338 µs">
<rect class="nj-heat-0" x="317" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="174" text-anchor="middle">1.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select&#10;1.30× the time of the fastest library (fully validating)&#10;way: D&#8203;OM&#10;twitter.json: 337 µs&#10;citm_catalog.json: 837 µs&#10;canada.json: 3,283 µs&#10;jeopardy.json: 134,701 µs">
<rect class="nj-heat-1" x="409" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="174" text-anchor="middle">1.30</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · select, checking less&#10;0.69× the time of the fastest fully validating library&#10;way: On-Demand&#10;twitter.json: 211 µs&#10;citm_catalog.json: 804 µs&#10;canada.json: 1,138 µs&#10;jeopardy.json: 51,878 µs&#10;reads lazily: On-Demand reads only what you ask for and steps over the rest by matching brackets">
<rect class="nj-heat-0" x="455" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="168" text-anchor="middle">0.69</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · edit&#10;simdjson&#x27;s documents are read-only: it has no A&#8203;PI to change a value and write the result">
<rect class="nj-heat-na" x="501" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-tick" x="546" y="174">n/a</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify&#10;1.86× the time of the fastest library (fully validating)&#10;way: D&#8203;OM + to_string&#10;twitter.json: 839 µs&#10;citm_catalog.json: 1,588 µs&#10;canada.json: 14,645 µs&#10;jeopardy.json: 292,317 µs">
<rect class="nj-heat-2" x="593" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="174" text-anchor="middle">1.86</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · minify, checking less&#10;0.21× the time of the fastest fully validating library&#10;way: minify&#10;twitter.json: 128 µs&#10;citm_catalog.json: 322 µs&#10;canada.json: 469 µs&#10;jeopardy.json: 50,456 µs&#10;simdjson::minify() only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="153" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="168" text-anchor="middle">0.21</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="181" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simdjson · write&#10;2.86× the time of the fastest library (fully validating)&#10;way: to_string&#10;twitter.json: 491 µs&#10;citm_catalog.json: 750 µs&#10;canada.json: 10,840 µs&#10;jeopardy.json: 196,092 µs">
<rect class="nj-heat-3" x="685" y="153" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="174" text-anchor="middle">2.86</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="210" text-anchor="end">sonic-cpp</text>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · validate, checking less&#10;1.45× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 425 µs&#10;citm_catalog.json: 1,032 µs&#10;canada.json: 3,618 µs&#10;jeopardy.json: 95,772 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="225" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="204" text-anchor="middle">1.45</text>
<text class="nj-charts-cell nj-charts-cell--small" x="270" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · sum, checking less&#10;1.32× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 482 µs&#10;citm_catalog.json: 1,234 µs&#10;canada.json: 4,412 µs&#10;jeopardy.json: 105,062 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="317" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="204" text-anchor="middle">1.32</text>
<text class="nj-charts-cell nj-charts-cell--small" x="362" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · select, checking less&#10;1.42× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 419 µs&#10;citm_catalog.json: 1,044 µs&#10;canada.json: 3,675 µs&#10;jeopardy.json: 111,999 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="409" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="204" text-anchor="middle">1.42</text>
<text class="nj-charts-cell nj-charts-cell--small" x="454" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · edit, checking less&#10;1.22× the time of the fastest fully validating library&#10;way: Document&#10;twitter.json: 663 µs&#10;citm_catalog.json: 1,572 µs&#10;canada.json: 8,879 µs&#10;jeopardy.json: 181,438 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="501" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="204" text-anchor="middle">1.22</text>
<text class="nj-charts-cell nj-charts-cell--small" x="546" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · minify, checking less&#10;1.36× the time of the fastest fully validating library&#10;way: Document + Serialize&#10;twitter.json: 667 µs&#10;citm_catalog.json: 1,568 µs&#10;canada.json: 9,007 µs&#10;jeopardy.json: 174,144 µs&#10;trusts U&#8203;TF-8: sonic-cpp 1.0.2 doesn&#x27;t check it">
<rect class="nj-heat-1" x="593" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="204" text-anchor="middle">1.36</text>
<text class="nj-charts-cell nj-charts-cell--small" x="638" y="217" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="sonic-cpp · write&#10;1.50× the time of the fastest library (fully validating)&#10;way: Serialize&#10;twitter.json: 270 µs&#10;citm_catalog.json: 533 µs&#10;canada.json: 5,100 µs&#10;jeopardy.json: 80,556 µs">
<rect class="nj-heat-1" x="685" y="189" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="210" text-anchor="middle">1.50</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="246" text-anchor="end">Boost.J&#8203;SON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · validate&#10;1.62× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 738 µs&#10;citm_catalog.json: 1,007 µs&#10;canada.json: 5,465 µs&#10;jeopardy.json: 59,249 µs">
<rect class="nj-heat-2" x="225" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="246" text-anchor="middle">1.62</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · sum&#10;1.32× the time of the fastest library (fully validating)&#10;way: S&#8203;AX&#10;twitter.json: 753 µs&#10;citm_catalog.json: 1,030 µs&#10;canada.json: 5,688 µs&#10;jeopardy.json: 61,479 µs">
<rect class="nj-heat-1" x="317" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="246" text-anchor="middle">1.32</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · select&#10;3.26× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 1,605 µs&#10;citm_catalog.json: 1,903 µs&#10;canada.json: 7,605 µs&#10;jeopardy.json: 214,973 µs">
<rect class="nj-heat-3" x="409" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="246" text-anchor="middle">3.26</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · edit&#10;2.44× the time of the fastest library (fully validating)&#10;way: parse&#10;twitter.json: 2,026 µs&#10;citm_catalog.json: 2,943 µs&#10;canada.json: 13,352 µs&#10;jeopardy.json: 337,632 µs">
<rect class="nj-heat-2" x="501" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="246" text-anchor="middle">2.44</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · minify&#10;2.70× the time of the fastest library (fully validating)&#10;way: parse + serialize&#10;twitter.json: 1,931 µs&#10;citm_catalog.json: 2,902 µs&#10;canada.json: 13,756 µs&#10;jeopardy.json: 328,321 µs">
<rect class="nj-heat-3" x="593" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="246" text-anchor="middle">2.70</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Boost.J&#8203;SON · write&#10;2.39× the time of the fastest library (fully validating)&#10;way: serialize&#10;twitter.json: 478 µs&#10;citm_catalog.json: 1,015 µs&#10;canada.json: 5,750 µs&#10;jeopardy.json: 137,840 µs">
<rect class="nj-heat-2" x="685" y="225" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="246" text-anchor="middle">2.39</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="282" text-anchor="end">simd-json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · validate&#10;2.17× the time of the fastest library (fully validating)&#10;way: tape (copy)&#10;twitter.json: 592 µs&#10;citm_catalog.json: 1,426 µs&#10;canada.json: 4,303 µs&#10;jeopardy.json: 211,716 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="225" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="282" text-anchor="middle">2.17</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · sum&#10;1.98× the time of the fastest library (fully validating)&#10;way: visitor (copy)&#10;twitter.json: 722 µs&#10;citm_catalog.json: 1,686 µs&#10;canada.json: 5,191 µs&#10;jeopardy.json: 220,582 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="317" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="282" text-anchor="middle">1.98</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · select&#10;2.44× the time of the fastest library (fully validating)&#10;way: structs (copy)&#10;twitter.json: 730 µs&#10;citm_catalog.json: 1,658 µs&#10;canada.json: 4,915 µs&#10;jeopardy.json: 266,073 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-2" x="409" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="282" text-anchor="middle">2.44</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · edit&#10;3.03× the time of the fastest library (fully validating)&#10;twitter.json: 2,071 µs · borrowed (copy)&#10;citm_catalog.json: 4,465 µs · borrowed (copy)&#10;canada.json: 16,360 µs · owned (copy)&#10;jeopardy.json: 416,658 µs · borrowed (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="282" text-anchor="middle">3.03</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · minify&#10;3.27× the time of the fastest library (fully validating)&#10;way: borrowed (copy)&#10;twitter.json: 1,924 µs&#10;citm_catalog.json: 4,375 µs&#10;canada.json: 15,278 µs&#10;jeopardy.json: 419,474 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="593" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="282" text-anchor="middle">3.27</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="simd-json (Rust) · write&#10;2.17× the time of the fastest library (fully validating)&#10;way: borrowed&#10;twitter.json: 604 µs&#10;citm_catalog.json: 809 µs&#10;canada.json: 4,825 µs&#10;jeopardy.json: 110,710 µs">
<rect class="nj-heat-2" x="685" y="261" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="282" text-anchor="middle">2.17</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="318" text-anchor="end">serde_json (Rust)</text>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate&#10;1.43× the time of the fastest library (fully validating)&#10;way: from_utf8 + IgnoredAny&#10;twitter.json: 634 µs&#10;citm_catalog.json: 1,448 µs&#10;canada.json: 2,402 µs&#10;jeopardy.json: 66,822 µs">
<rect class="nj-heat-1" x="225" y="297" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="318" text-anchor="middle">1.43</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · validate, checking less&#10;1.28× the time of the fastest fully validating library&#10;way: IgnoredAny&#10;twitter.json: 487 µs&#10;citm_catalog.json: 1,370 µs&#10;canada.json: 2,318 µs&#10;jeopardy.json: 59,801 µs&#10;trusts U&#8203;TF-8 in the strings it skips (from_slice); strings it reads are checked">
<rect class="nj-heat-1" x="271" y="297" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="312" text-anchor="middle">1.28</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="325" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · sum&#10;2.37× the time of the fastest library (fully validating)&#10;way: visitor&#10;twitter.json: 1,318 µs&#10;citm_catalog.json: 2,299 µs&#10;canada.json: 7,610 µs&#10;jeopardy.json: 123,810 µs">
<rect class="nj-heat-2" x="317" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="318" text-anchor="middle">2.37</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · select&#10;1.62× the time of the fastest library (fully validating)&#10;way: from_utf8 + structs&#10;twitter.json: 769 µs&#10;citm_catalog.json: 1,504 µs&#10;canada.json: 2,442 µs&#10;jeopardy.json: 108,386 µs">
<rect class="nj-heat-2" x="409" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="318" text-anchor="middle">1.62</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · edit&#10;4.96× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 4,474 µs&#10;citm_catalog.json: 6,922 µs&#10;canada.json: 18,301 µs&#10;jeopardy.json: 805,290 µs">
<rect class="nj-heat-3" x="501" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="318" text-anchor="middle">4.96</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · minify&#10;5.01× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 4,081 µs&#10;citm_catalog.json: 6,880 µs&#10;canada.json: 17,249 µs&#10;jeopardy.json: 615,033 µs">
<rect class="nj-heat-4" x="593" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="318" text-anchor="middle">5.01</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="serde_json (Rust) · write&#10;2.12× the time of the fastest library (fully validating)&#10;way: Value&#10;twitter.json: 563 µs&#10;citm_catalog.json: 882 µs&#10;canada.json: 3,979 µs&#10;jeopardy.json: 120,716 µs">
<rect class="nj-heat-2" x="685" y="297" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="318" text-anchor="middle">2.12</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="354" text-anchor="end">Glaze</text>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · validate&#10;1.33× the time of the fastest library (fully validating)&#10;way: validate_json&#10;twitter.json: 590 µs&#10;citm_catalog.json: 1,399 µs&#10;canada.json: 1,847 µs&#10;jeopardy.json: 71,293 µs">
<rect class="nj-heat-1" x="225" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="354" text-anchor="middle">1.33</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum&#10;6.46× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 3,206 µs&#10;citm_catalog.json: 5,928 µs&#10;canada.json: 20,405 µs&#10;jeopardy.json: 403,975 µs">
<rect class="nj-heat-4" x="317" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="354" text-anchor="middle">6.46</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · sum, checking less&#10;5.20× the time of the fastest fully validating library&#10;twitter.json: 2,948 µs · lazy_json&#10;citm_catalog.json: 5,928 µs · generic (validates fully)&#10;canada.json: 16,203 µs · lazy_json&#10;jeopardy.json: 231,683 µs · lazy_json&#10;reads lazily: lazy_json reads only what you ask for and steps over the rest">
<rect class="nj-heat-4" x="363" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="348" text-anchor="middle">5.20</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="361" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select&#10;1.35× the time of the fastest library (fully validating)&#10;way: structs (validate_skipped)&#10;twitter.json: 539 µs&#10;citm_catalog.json: 1,475 µs&#10;canada.json: 1,850 µs&#10;jeopardy.json: 99,194 µs">
<rect class="nj-heat-1" x="409" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="354" text-anchor="middle">1.35</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · select, checking less&#10;0.58× the time of the fastest fully validating library&#10;way: structs&#10;twitter.json: 348 µs&#10;citm_catalog.json: 408 µs&#10;canada.json: 449 µs&#10;jeopardy.json: 77,565 µs&#10;reads into structs and steps over fields it doesn&#x27;t know without checking them (validate_skipped checks them too)">
<rect class="nj-heat-0" x="455" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="348" text-anchor="middle">0.58</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="361" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · edit&#10;5.23× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 3,767 µs&#10;citm_catalog.json: 6,532 µs&#10;canada.json: 24,351 µs&#10;jeopardy.json: 940,280 µs">
<rect class="nj-heat-4" x="501" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="354" text-anchor="middle">5.23</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify&#10;5.12× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 3,647 µs&#10;citm_catalog.json: 6,503 µs&#10;canada.json: 25,082 µs&#10;jeopardy.json: 546,003 µs">
<rect class="nj-heat-4" x="593" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="354" text-anchor="middle">5.12</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · minify, checking less&#10;0.70× the time of the fastest fully validating library&#10;way: minify_json&#10;twitter.json: 428 µs&#10;citm_catalog.json: 1,144 µs&#10;canada.json: 2,468 µs&#10;jeopardy.json: 94,867 µs&#10;minify_json only removes whitespace, without parsing the values">
<rect class="nj-heat-0" x="639" y="333" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="348" text-anchor="middle">0.70</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="361" text-anchor="middle">P</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="Glaze · write&#10;1.92× the time of the fastest library (fully validating)&#10;way: generic&#10;twitter.json: 364 µs&#10;citm_catalog.json: 712 µs&#10;canada.json: 4,265 µs&#10;jeopardy.json: 143,981 µs">
<rect class="nj-heat-2" x="685" y="333" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="354" text-anchor="middle">1.92</text>
</g>
<text class="nj-charts-rowlabel nj-charts-name-json" x="216" y="390" text-anchor="end">nlohmann/json json</text>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · validate&#10;2.00× the time of the fastest library (fully validating)&#10;way: accept&#10;twitter.json: 789 µs&#10;citm_catalog.json: 1,631 µs&#10;canada.json: 4,570 µs&#10;jeopardy.json: 94,289 µs">
<rect class="nj-heat-2" x="225" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="270" y="390" text-anchor="middle">2.00</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · sum&#10;1.73× the time of the fastest library (fully validating)&#10;way: sax&#10;twitter.json: 807 µs&#10;citm_catalog.json: 1,647 µs&#10;canada.json: 5,962 µs&#10;jeopardy.json: 100,804 µs">
<rect class="nj-heat-2" x="317" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="362" y="390" text-anchor="middle">1.73</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · select&#10;7.68× the time of the fastest library (fully validating)&#10;twitter.json: 3,523 µs · parse&#10;citm_catalog.json: 5,534 µs · structs (from_json)&#10;canada.json: 12,684 µs · parse&#10;jeopardy.json: 623,070 µs · structs (from_json)">
<rect class="nj-heat-4" x="409" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="454" y="390" text-anchor="middle">7.68</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · edit&#10;4.27× the time of the fastest library (fully validating)&#10;way: ordered_json&#10;twitter.json: 3,156 µs&#10;citm_catalog.json: 5,280 µs&#10;canada.json: 16,247 µs&#10;jeopardy.json: 922,463 µs">
<rect class="nj-heat-3" x="501" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="546" y="390" text-anchor="middle">4.27</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · minify&#10;5.15× the time of the fastest library (fully validating)&#10;way: parse + dump&#10;twitter.json: 3,980 µs&#10;citm_catalog.json: 6,495 µs&#10;canada.json: 17,573 µs&#10;jeopardy.json: 730,814 µs">
<rect class="nj-heat-4" x="593" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="638" y="390" text-anchor="middle">5.15</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="nlohmann/json json · write&#10;1.88× the time of the fastest library (fully validating)&#10;way: dump&#10;twitter.json: 441 µs&#10;citm_catalog.json: 628 µs&#10;canada.json: 4,091 µs&#10;jeopardy.json: 129,455 µs">
<rect class="nj-heat-2" x="685" y="369" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="390" text-anchor="middle">1.88</text>
</g>
<text class="nj-charts-rowlabel " x="216" y="426" text-anchor="end">RapidJSON</text>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate&#10;3.97× the time of the fastest library (fully validating)&#10;twitter.json: 1,638 µs · insitu (copy)&#10;citm_catalog.json: 2,230 µs · S&#8203;AX&#10;canada.json: 11,264 µs · S&#8203;AX&#10;jeopardy.json: 209,691 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="225" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="247.5" y="426" text-anchor="middle">3.97</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · validate, checking less&#10;3.13× the time of the fastest fully validating library&#10;twitter.json: 1,135 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,666 µs · S&#8203;AX (no encoding check)&#10;canada.json: 11,264 µs · S&#8203;AX (validates fully)&#10;jeopardy.json: 157,274 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="271" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="292.5" y="420" text-anchor="middle">3.13</text>
<text class="nj-charts-cell nj-charts-cell--small" x="292.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum&#10;3.21× the time of the fastest library (fully validating)&#10;twitter.json: 1,679 µs · insitu (copy)&#10;citm_catalog.json: 2,388 µs · S&#8203;AX&#10;canada.json: 11,030 µs · S&#8203;AX&#10;jeopardy.json: 216,612 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="317" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="339.5" y="426" text-anchor="middle">3.21</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · sum, checking less&#10;2.54× the time of the fastest fully validating library&#10;twitter.json: 1,185 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,768 µs · S&#8203;AX (no encoding check)&#10;canada.json: 11,030 µs · S&#8203;AX (validates fully)&#10;jeopardy.json: 161,397 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="363" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="384.5" y="420" text-anchor="middle">2.54</text>
<text class="nj-charts-cell nj-charts-cell--small" x="384.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select&#10;3.98× the time of the fastest library (fully validating)&#10;twitter.json: 1,779 µs · insitu (copy)&#10;citm_catalog.json: 2,257 µs · insitu (copy)&#10;canada.json: 12,214 µs · Document&#10;jeopardy.json: 226,825 µs · insitu (copy)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="409" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="431.5" y="426" text-anchor="middle">3.98</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · select, checking less&#10;3.24× the time of the fastest fully validating library&#10;twitter.json: 1,194 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 1,923 µs · Document (no encoding check)&#10;canada.json: 12,165 µs · Document (no encoding check)&#10;jeopardy.json: 175,262 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="455" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="476.5" y="420" text-anchor="middle">3.24</text>
<text class="nj-charts-cell nj-charts-cell--small" x="476.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit&#10;3.02× the time of the fastest library (fully validating)&#10;way: insitu (copy)&#10;twitter.json: 2,511 µs&#10;citm_catalog.json: 3,310 µs&#10;canada.json: 20,627 µs&#10;jeopardy.json: 362,717 µs&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="501" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="523.5" y="426" text-anchor="middle">3.02</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · edit, checking less&#10;2.63× the time of the fastest fully validating library&#10;twitter.json: 1,896 µs · insitu (copy) (no encoding check)&#10;citm_catalog.json: 2,942 µs · Document (no encoding check)&#10;canada.json: 20,627 µs · insitu (copy) (validates fully)&#10;jeopardy.json: 314,375 µs · insitu (copy) (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)&#10;(copy): parses in place, on a copy of the input that is part of the time">
<rect class="nj-heat-3" x="547" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="568.5" y="420" text-anchor="middle">2.63</text>
<text class="nj-charts-cell nj-charts-cell--small" x="568.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify&#10;3.65× the time of the fastest library (fully validating)&#10;twitter.json: 2,963 µs · S&#8203;AX to Writer&#10;citm_catalog.json: 3,189 µs · S&#8203;AX to Writer&#10;canada.json: 21,761 µs · Document + Writer&#10;jeopardy.json: 406,899 µs · S&#8203;AX to Writer">
<rect class="nj-heat-3" x="593" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="615.5" y="426" text-anchor="middle">3.65</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · minify, checking less&#10;2.79× the time of the fastest fully validating library&#10;twitter.json: 1,872 µs · S&#8203;AX to Writer (no encoding check)&#10;citm_catalog.json: 2,490 µs · S&#8203;AX to Writer (no encoding check)&#10;canada.json: 21,761 µs · Document + Writer (validates fully)&#10;jeopardy.json: 282,973 µs · S&#8203;AX to Writer (no encoding check)&#10;trusts U&#8203;TF-8: RapidJSON&#x27;s default (kParseValidateEncodingFlag checks it)">
<rect class="nj-heat-3" x="639" y="405" width="44" height="34" rx="3"/>
<text class="nj-charts-cell" x="660.5" y="420" text-anchor="middle">2.79</text>
<text class="nj-charts-cell nj-charts-cell--small" x="660.5" y="433" text-anchor="middle">U</text>
</g>
<g class="nj-heat-cell" tabindex="0" data-tip="RapidJSON · write&#10;3.05× the time of the fastest library (fully validating)&#10;way: Writer&#10;twitter.json: 746 µs&#10;citm_catalog.json: 1,032 µs&#10;canada.json: 8,773 µs&#10;jeopardy.json: 150,334 µs">
<rect class="nj-heat-3" x="685" y="405" width="90" height="34" rx="3"/>
<text class="nj-charts-cell" x="730" y="426" text-anchor="middle">3.05</text>
</g>
<text class="nj-charts-tick nj-charts-tick--l" x="8" y="472">time relative to the fastest fully validating library, less is better</text>
<g><rect class="nj-heat-0" x="8" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="46" y="496" text-anchor="middle">below 1.15</text></g>
<g><rect class="nj-heat-1" x="88" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="126" y="496" text-anchor="middle">1.15 to 1.5</text></g>
<g><rect class="nj-heat-2" x="168" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="206" y="496" text-anchor="middle">1.5 to 2.5</text></g>
<g><rect class="nj-heat-3" x="248" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="286" y="496" text-anchor="middle">2.5 to 5</text></g>
<g><rect class="nj-heat-4" x="328" y="482" width="76" height="20" rx="3"/>
<text class="nj-charts-cell nj-charts-cell--small" x="366" y="496" text-anchor="middle">5 and more</text></g>
<rect class="nj-heat-na" x="420" y="482" width="40" height="20" rx="3"/>
<text class="nj-charts-tick" x="440" y="496">n/a</text>
<text class="nj-charts-tick nj-charts-tick--l" x="468" y="496">no A&#8203;PI for it</text>
</svg>

After

Width:  |  Height:  |  Size: 43 KiB

+69
View File
@@ -104,3 +104,72 @@
init();
}
})();
/* figures: the tooltips of the heatmaps in home/blog/how_3_13_0_got_faster.md (perf_blog_usecases_*.svg). Each
cell is a focusable <g data-tip>: its lines (the first one the heading) are shown on hover, keyboard focus or tap.
Without JS, the figure's <desc> and the tables in the appendix carry the same numbers. */
(function () {
"use strict";
var tip = null;
var current = null;
function show(cell) {
if (!tip) {
tip = document.createElement("div");
tip.className = "nj-heat-tip";
tip.setAttribute("role", "tooltip");
tip.hidden = true;
document.body.appendChild(tip);
}
if (current) current.classList.remove("nj-heat-on");
current = cell;
cell.classList.add("nj-heat-on");
var lines = (cell.getAttribute("data-tip") || "").split("\n");
tip.textContent = "";
lines.forEach(function (line, i) {
var el = document.createElement(i === 0 ? "strong" : "div");
el.textContent = line;
tip.appendChild(el);
});
tip.hidden = false;
var r = cell.getBoundingClientRect();
var w = tip.offsetWidth, h = tip.offsetHeight;
var x = Math.min(Math.max(8, r.left + r.width / 2 - w / 2), document.documentElement.clientWidth - w - 8);
var y = r.bottom + 8 + h > window.innerHeight ? r.top - h - 8 : r.bottom + 8;
tip.style.left = (x + window.scrollX) + "px";
tip.style.top = (y + window.scrollY) + "px";
}
function hide() {
if (current) current.classList.remove("nj-heat-on");
current = null;
if (tip) tip.hidden = true;
}
function init() {
hide();
Array.prototype.forEach.call(document.querySelectorAll("svg.nj-charts--heat .nj-heat-cell"), function (cell) {
if (cell.dataset.njHeatReady) return;
cell.dataset.njHeatReady = "1";
cell.addEventListener("mouseenter", function () { show(cell); });
cell.addEventListener("mouseleave", hide);
cell.addEventListener("focus", function () { show(cell); });
cell.addEventListener("blur", hide);
// a tap also focuses the cell; a tap elsewhere or Escape hides the tooltip
cell.addEventListener("click", function (ev) { ev.stopPropagation(); show(cell); });
});
}
document.addEventListener("click", hide);
document.addEventListener("keydown", function (ev) { if (ev.key === "Escape") hide(); });
window.addEventListener("scroll", hide, { passive: true });
if (typeof document$ !== "undefined" && document$ && typeof document$.subscribe === "function") {
document$.subscribe(init);
} else if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();
+6
View File
@@ -8,6 +8,7 @@
*[BDFL]: Benevolent Dictator for Life
*[BJData]: Binary JData
*[BON8]: Binary Object Notation 8
*[BSL]: Boost Software License
*[BSON]: Binary JSON
*[CBOR]: Concise Binary Object Representation
*[CC0]: Creative Commons Zero
@@ -16,6 +17,7 @@
*[CUDA]: Compute Unified Device Architecture
*[CVE]: Common Vulnerabilities and Exposures
*[DOM]: Document Object Model
*[EDG]: Edison Design Group, maker of a C++ compiler front end
*[EOF]: End of File
*[FAQ]: Frequently Asked Questions
*[GCC]: GNU Compiler Collection
@@ -31,9 +33,11 @@
*[JSONC]: JSON with Comments
*[JWCC]: JSON With Commas and Comments
*[LLDB]: LLVM Debugger
*[LTO]: Link-Time Optimization
*[LTS]: Long-Term Support
*[MinGW]: Minimalist GNU for Windows
*[MIT]: Massachusetts Institute of Technology
*[MPL]: Mozilla Public License
*[MsgPack]: MessagePack
*[MSVC]: Microsoft Visual C++
*[NaN]: Not a Number
@@ -42,6 +46,7 @@
*[NEON]: Arm SIMD instruction set extension
*[NUL]: Null character (U+0000, byte value 0)
*[ODR]: One Definition Rule
*[PCH]: Precompiled Header
*[REUSE]: Software licensing specification by the Free Software Foundation Europe
*[RFC]: Request for Comments
*[RTTI]: Runtime Type Information
@@ -60,3 +65,4 @@
*[UDLs]: User-defined literals
*[URL]: Uniform Resource Locator
*[UTF]: Unicode Transformation Format
*[XOR]: Exclusive or
@@ -0,0 +1,183 @@
benchmark,unit,3.12.0,3.13.0,speedup
FromBinaryBuffer/bson / twitter,ns,3.07203e+06,998445,3.077
ParseStringOrdered/jeopardy,ns,3.56038e+08,1.10829e+08,3.213
JsonPointerToString/twitter,ns,2.16889e+06,793513,2.733
BinaryToCbor/8192,ns,511.25,238.725,2.142
FromMsgpack/unsigned_ints,ns,5.51164e+07,2.72444e+07,2.023
JsonPointerAt/twitter,ns,780306,585055,1.334
CopyOnly/twitter,ns,393964,399209,0.987
FlattenOrdered/citm_catalog,ns,2.52682e+08,1.37388e+06,183.919
FromBinaryFile/ubjson / canada,ns,1.34e+07,6.20075e+06,2.161
FromBinaryShape/containers / bjdata,ns,1.41456e+07,7.04794e+06,2.007
ParseIndented/jeopardy / 4,ns,3.33616e+08,1.31177e+08,2.543
FromMsgpack/signed_ints,ns,6.19882e+07,3.19294e+07,1.941
FromBinaryShape/containers / bson,ns,1.69936e+07,9.81169e+06,1.732
BinaryToCbor/128,ns,247.24,110.472,2.238
FromBinaryBuffer/cbor / jeopardy,ns,3.52319e+08,1.15873e+08,3.041
ParseFile/jeopardy,ns,3.26899e+08,1.57231e+08,2.079
FromMsgpack/jeopardy,ns,1.11847e+09,1.81305e+08,6.169
FromBinaryFile/cbor / twitter,ns,9.70523e+06,1.5381e+06,6.310
ToCbor/floats,ns,8.8461e+06,1.88426e+06,4.695
ParseFile/small_signed_ints,ns,6.30771e+07,3.13826e+07,2.010
FromBinaryBuffer/msgpack / twitter,ns,3.01937e+06,937570,3.220
BinaryToCbor/16384,ns,947.242,408.275,2.320
FromBinaryFile/bson / twitter,ns,9.98109e+06,1.78121e+06,5.604
ParseString/twitter,ns,3.15572e+06,1.04655e+06,3.015
Unflatten/twitter,ns,4.47709e+06,2.11403e+06,2.118
BinaryToCbor/8,ns,242.891,46.6253,5.209
BinaryToCbor/16,ns,238.431,46.5179,5.126
Dump/small_signed_ints / 4,ns,2.49933e+07,8.62966e+06,2.896
ParseString/jeopardy,ns,3.04927e+08,1.29515e+08,2.354
Dump/signed_ints / 4,ns,3.18294e+07,1.68297e+07,1.891
Flatten/twitter,ns,3.4886e+06,2.00532e+06,1.740
FromBinaryBuffer/cbor / twitter,ns,3.00428e+06,964870,3.114
Dump/jeopardy / 4,ns,2.19025e+08,3.43818e+07,6.370
SaxParse/citm_catalog,ns,6.33865e+06,969665,6.537
JsonPointerAt/citm_catalog,ns,1.80656e+06,1.10975e+06,1.628
DestroyOnly/citm_catalog,ns,874073,663615,1.317
FromBinaryShape/scalars / ubjson,ns,2.46643e+07,1.13906e+07,2.165
Unflatten/canada,ns,4.04569e+07,1.07458e+07,3.765
ParseString/floats,ns,1.18934e+08,3.02332e+07,3.934
ParseIndented/canada / 4,ns,3.38495e+07,5.02409e+06,6.737
ParseString/signed_ints,ns,1.19593e+08,3.14351e+07,3.804
ParseFile/signed_ints,ns,1.24813e+08,4.61765e+07,2.703
JsonPointerContains/twitter,ns,1.27938e+06,606069,2.111
Dump/floats / 4,ns,7.10935e+07,2.41369e+07,2.945
Dump/floats / -,ns,6.27641e+07,2.33213e+07,2.691
ToCbor/canada,ns,1.36795e+06,546001,2.505
FromBinaryBuffer/bson / canada,ns,9.21307e+06,5.51059e+06,1.672
ToCbor/twitter,ns,638321,141975,4.496
ParseIndented/twitter / 4,ns,3.58298e+06,1.10646e+06,3.238
Iterate/citm_catalog,ns,297646,167302,1.779
FromBinaryBuffer/bjdata / canada,ns,8.08015e+06,4.17334e+06,1.936
ParseStreamValues/ndjson,ns,6.96248e+06,3.7254e+06,1.869
Diff/twitter,ns,4.79296e+06,635531,7.542
Dump/citm_catalog / -,ns,1.37753e+06,290658,4.739
FromBinaryShape/nested / bjdata,ns,96017.5,37882.1,2.535
ToJsonStrings/copy,ns,5.83243e+06,5.54046e+06,1.053
Dump/canada / 4,ns,8.9039e+06,2.9943e+06,2.974
CopyRing/twitter,ns,855374,766521,1.116
FromBinaryBuffer/cbor / citm_catalog,ns,3.70397e+06,1.46121e+06,2.535
FromBinaryFile/bjdata / twitter,ns,1.02688e+07,1.90492e+06,5.391
FromBinaryShape/containers / ubjson_optimized,ns,1.4727e+07,4.80309e+06,3.066
FromMsgpack/citm_catalog,ns,8.85701e+06,2.2473e+06,3.941
CopyOnly/canada,ns,1.53425e+06,1.49609e+06,1.026
Equal/canada,ns,453965,332795,1.364
Diff/citm_catalog,ns,6.74369e+06,1.07135e+06,6.295
ParseStringOrdered/canada,ns,1.49834e+07,4.29102e+06,3.492
Flatten/canada,ns,2.82148e+07,1.11369e+07,2.533
Accept/canada,ns,1.26836e+07,2.25933e+06,5.614
CopyAssign/twitter,ns,804857,735341,1.095
BinaryToCbor/4096,ns,402.442,159.22,2.528
ParseFILE/citm_catalog,ns,3.45528e+07,7.26455e+06,4.756
ToCbor/signed_ints,ns,1.13256e+07,2.76748e+06,4.092
Patch/canada,ns,9.80719e+06,3.36006e+06,2.919
GetArray<std::vector<int>>,ns,6589.63,655.021,10.060
Dump/canada / -,ns,6.62927e+06,2.24661e+06,2.951
GetVectorDouble/floats,ns,6.62214e+06,641259,10.327
Accept/citm_catalog,ns,6.3596e+06,909397,6.993
ParseFILE/twitter,ns,1.35627e+07,3.27982e+06,4.135
FromBinaryBuffer/msgpack / jeopardy,ns,3.54302e+08,1.10166e+08,3.216
ParseFile/floats,ns,1.3128e+08,4.88806e+07,2.686
Accept/small_signed_ints,ns,5.5849e+07,1.88756e+07,2.959
Accept/jeopardy,ns,2.2049e+08,6.3504e+07,3.472
Accept/signed_ints,ns,1.15055e+08,2.84818e+07,4.040
CopyRing/canada,ns,3.68758e+06,2.88527e+06,1.278
Patch/twitter,ns,1.44963e+06,848729,1.708
Iterate/twitter,ns,87147.2,61831.9,1.409
ParseFile/twitter,ns,3.33795e+06,1.3545e+06,2.464
GetArray<std::deque<int>>,ns,8110.78,1156.06,7.016
FromBinaryBuffer/cbor / canada,ns,8.20468e+06,2.31071e+06,3.551
Equal/twitter,ns,141057,125995,1.120
ParseStreamValues/numbers,ns,1.87073e+06,370959,5.043
Dump/small_signed_ints / -,ns,1.78162e+07,7.86562e+06,2.265
JsonPointerToString/citm_catalog,ns,6.63798e+06,1.869e+06,3.552
Copy/twitter,ns,797034,721889,1.104
Diff/canada,ns,3.83337e+07,3.67301e+06,10.437
FromBinaryBuffer/ubjson_optimized / twitter,ns,3.1281e+06,959992,3.258
BinaryToCbor/32,ns,251.857,47.32,5.322
GetArray<std::set<int>>,ns,58113.1,40911.2,1.420
CopyAssign/citm_catalog,ns,1.66804e+06,1.48043e+06,1.127
ToCbor/jeopardy,ns,7.16464e+07,2.11077e+07,3.394
CopyRing/citm_catalog,ns,1.70236e+06,1.50767e+06,1.129
FromBinaryBuffer/ubjson / canada,ns,8.14082e+06,4.15725e+06,1.958
ToCbor/small_signed_ints,ns,1.02087e+07,2.3872e+06,4.276
DestroyOnly/canada,ns,2.13545e+06,1.37061e+06,1.558
FromBinaryBuffer/ubjson / citm_catalog,ns,3.81161e+06,1.73601e+06,2.196
Dump/jeopardy / -,ns,2.01242e+08,3.04052e+07,6.619
FromBinaryBuffer/msgpack / citm_catalog,ns,3.70428e+06,1.42385e+06,2.602
ParseStringOrdered/citm_catalog,ns,1.07899e+07,1.63999e+06,6.579
ParseString/unsigned_ints,ns,1.17897e+08,3.02538e+07,3.897
Patch/citm_catalog,ns,2.48869e+06,1.60776e+06,1.548
SaxParse/canada,ns,1.28389e+07,3.21707e+06,3.991
ParseString/citm_catalog,ns,7.20303e+06,1.7454e+06,4.127
FromBinaryFile/cbor / canada,ns,1.42056e+07,4.37844e+06,3.244
BinaryToCbor/256,ns,269.641,86.3027,3.124
ParseFILE/canada,ns,5.22098e+07,1.38907e+07,3.759
BinaryToCbor/32768,ns,1538.42,806.578,1.907
Accept/floats,ns,1.13316e+08,2.40029e+07,4.721
FromMsgpack/floats,ns,5.92985e+07,2.71551e+07,2.184
ParseString/small_signed_ints,ns,6.05098e+07,2.18687e+07,2.767
JsonPointerParse/citm_catalog,ns,5.64871e+06,2.16902e+06,2.604
Copy/canada,ns,3.64004e+06,2.8296e+06,1.286
Dump/twitter / 4,ns,1.56293e+06,247785,6.308
FromBinaryShape/nested / msgpack,ns,90351.2,34224,2.640
FromBinaryBuffer/ubjson_optimized / canada,ns,8.36221e+06,2.82594e+06,2.959
JsonPointerContains/citm_catalog,ns,2.71985e+06,1.23844e+06,2.196
FromMsgpack/small_signed_ints,ns,6.27969e+07,3.33815e+07,1.881
DestroyOnly/twitter,ns,401772,322543,1.246
FromBinaryShape/containers / msgpack,ns,1.37471e+07,3.71417e+06,3.701
FromBinaryShape/scalars / msgpack,ns,2.40944e+07,9.77821e+06,2.464
ToCbor/citm_catalog,ns,1.02089e+06,257529,3.964
GetVectorInt/signed_ints,ns,8.04308e+06,3.35704e+06,2.396
Accept/twitter,ns,2.45943e+06,458446,5.365
Iterate/canada,ns,861455,320474,2.688
ToCbor/unsigned_ints,ns,7.98977e+06,2.75684e+06,2.898
FromBinaryShape/scalars / bjdata,ns,2.43317e+07,1.12007e+07,2.172
BinaryToCbor/2048,ns,332.826,114.084,2.917
BinaryToCbor/512,ns,291.316,92.8039,3.139
FlattenOrdered/twitter,ns,4.92534e+07,851500,57.843
Copy/citm_catalog,ns,1.61348e+06,1.44942e+06,1.113
FromBinaryShape/containers / ubjson,ns,1.40981e+07,6.87399e+06,2.051
BinaryToCbor/1024,ns,304.119,95.8643,3.172
FromBinaryBuffer/ubjson / twitter,ns,3.12147e+06,962822,3.242
Dump/signed_ints / -,ns,2.34455e+07,1.61521e+07,1.452
FromBinaryShape/scalars / cbor,ns,2.54779e+07,9.63099e+06,2.645
FromBinaryBuffer/cbor / signed_ints,ns,3.57449e+07,1.2803e+07,2.792
CopyOnly/citm_catalog,ns,734852,783826,0.938
Dump/unsigned_ints / -,ns,2.3437e+07,1.6565e+07,1.415
Accept/unsigned_ints,ns,1.14173e+08,2.74092e+07,4.165
FromMsgpack/canada,ns,1.42472e+07,4.37022e+06,3.260
ParseStringOrdered/twitter,ns,4.32143e+06,910717,4.745
Dump/twitter / -,ns,1.38581e+06,207620,6.675
BinaryToCbor/64,ns,250.506,81.5793,3.071
JsonPointerParse/twitter,ns,2.40825e+06,979256,2.459
GetMap/citm_catalog,ns,3.41415e+06,2.37109e+06,1.440
ToJsonStrings/move,ns,5.83899e+06,3.02241e+06,1.932
FromBinaryBuffer/ubjson / jeopardy,ns,3.67059e+08,1.15063e+08,3.190
FromBinaryShape/nested / ubjson,ns,96068.6,37753.5,2.545
FromBinaryBuffer/bjdata / twitter,ns,3.11851e+06,963022,3.238
FromBinaryShape/nested / cbor,ns,93124.8,34434.7,2.704
ParseFile/citm_catalog,ns,7.62707e+06,2.39694e+06,3.182
FromBinaryFile/ubjson / twitter,ns,1.04355e+07,1.90842e+06,5.468
Dump/citm_catalog / 4,ns,1.92608e+06,416105,4.629
CopyAssign/canada,ns,3.68545e+06,2.87633e+06,1.281
Unflatten/citm_catalog,ns,9.65545e+06,3.47021e+06,2.782
FromBinaryBuffer/bjdata_optimized / twitter,ns,3.14359e+06,967149,3.250
FromBinaryBuffer/cbor / floats,ns,2.88404e+07,8.22731e+06,3.505
Equal/citm_catalog,ns,264018,254367,1.038
FromBinaryShape/containers / cbor,ns,1.38356e+07,3.8445e+06,3.599
Flatten/citm_catalog,ns,6.43708e+06,2.96328e+06,2.172
FromMsgpack/twitter,ns,9.69832e+06,1.46011e+06,6.642
FromBinaryBuffer/bson / citm_catalog,ns,3.86353e+06,1.73584e+06,2.226
FromBinaryBuffer/msgpack / canada,ns,8.21458e+06,2.2769e+06,3.608
"GetArray<std::array<int, 1000>>",ns,2228.17,630.225,3.536
SaxParse/twitter,ns,2.4729e+06,472447,5.234
ParseString/canada,ns,1.50552e+07,4.35028e+06,3.461
ParseFile/canada,ns,1.79247e+07,6.11532e+06,2.931
ParseFile/unsigned_ints,ns,1.22099e+08,4.40082e+07,2.774
FromCborChunkedString/10000 chunks,ns,89638.1,81306.2,1.102
FromBinaryShape/nested / bson,ns,102178,46148.5,2.214
ParseIndented/citm_catalog / 4,ns,7.27956e+06,1.75204e+06,4.155
Dump/unsigned_ints / 4,ns,3.15101e+07,1.7373e+07,1.814
FromBinaryBuffer/bjdata_optimized / canada,ns,8.52567e+06,2.93164e+06,2.908
1 benchmark unit 3.12.0 3.13.0 speedup
2 FromBinaryBuffer/bson / twitter ns 3.07203e+06 998445 3.077
3 ParseStringOrdered/jeopardy ns 3.56038e+08 1.10829e+08 3.213
4 JsonPointerToString/twitter ns 2.16889e+06 793513 2.733
5 BinaryToCbor/8192 ns 511.25 238.725 2.142
6 FromMsgpack/unsigned_ints ns 5.51164e+07 2.72444e+07 2.023
7 JsonPointerAt/twitter ns 780306 585055 1.334
8 CopyOnly/twitter ns 393964 399209 0.987
9 FlattenOrdered/citm_catalog ns 2.52682e+08 1.37388e+06 183.919
10 FromBinaryFile/ubjson / canada ns 1.34e+07 6.20075e+06 2.161
11 FromBinaryShape/containers / bjdata ns 1.41456e+07 7.04794e+06 2.007
12 ParseIndented/jeopardy / 4 ns 3.33616e+08 1.31177e+08 2.543
13 FromMsgpack/signed_ints ns 6.19882e+07 3.19294e+07 1.941
14 FromBinaryShape/containers / bson ns 1.69936e+07 9.81169e+06 1.732
15 BinaryToCbor/128 ns 247.24 110.472 2.238
16 FromBinaryBuffer/cbor / jeopardy ns 3.52319e+08 1.15873e+08 3.041
17 ParseFile/jeopardy ns 3.26899e+08 1.57231e+08 2.079
18 FromMsgpack/jeopardy ns 1.11847e+09 1.81305e+08 6.169
19 FromBinaryFile/cbor / twitter ns 9.70523e+06 1.5381e+06 6.310
20 ToCbor/floats ns 8.8461e+06 1.88426e+06 4.695
21 ParseFile/small_signed_ints ns 6.30771e+07 3.13826e+07 2.010
22 FromBinaryBuffer/msgpack / twitter ns 3.01937e+06 937570 3.220
23 BinaryToCbor/16384 ns 947.242 408.275 2.320
24 FromBinaryFile/bson / twitter ns 9.98109e+06 1.78121e+06 5.604
25 ParseString/twitter ns 3.15572e+06 1.04655e+06 3.015
26 Unflatten/twitter ns 4.47709e+06 2.11403e+06 2.118
27 BinaryToCbor/8 ns 242.891 46.6253 5.209
28 BinaryToCbor/16 ns 238.431 46.5179 5.126
29 Dump/small_signed_ints / 4 ns 2.49933e+07 8.62966e+06 2.896
30 ParseString/jeopardy ns 3.04927e+08 1.29515e+08 2.354
31 Dump/signed_ints / 4 ns 3.18294e+07 1.68297e+07 1.891
32 Flatten/twitter ns 3.4886e+06 2.00532e+06 1.740
33 FromBinaryBuffer/cbor / twitter ns 3.00428e+06 964870 3.114
34 Dump/jeopardy / 4 ns 2.19025e+08 3.43818e+07 6.370
35 SaxParse/citm_catalog ns 6.33865e+06 969665 6.537
36 JsonPointerAt/citm_catalog ns 1.80656e+06 1.10975e+06 1.628
37 DestroyOnly/citm_catalog ns 874073 663615 1.317
38 FromBinaryShape/scalars / ubjson ns 2.46643e+07 1.13906e+07 2.165
39 Unflatten/canada ns 4.04569e+07 1.07458e+07 3.765
40 ParseString/floats ns 1.18934e+08 3.02332e+07 3.934
41 ParseIndented/canada / 4 ns 3.38495e+07 5.02409e+06 6.737
42 ParseString/signed_ints ns 1.19593e+08 3.14351e+07 3.804
43 ParseFile/signed_ints ns 1.24813e+08 4.61765e+07 2.703
44 JsonPointerContains/twitter ns 1.27938e+06 606069 2.111
45 Dump/floats / 4 ns 7.10935e+07 2.41369e+07 2.945
46 Dump/floats / - ns 6.27641e+07 2.33213e+07 2.691
47 ToCbor/canada ns 1.36795e+06 546001 2.505
48 FromBinaryBuffer/bson / canada ns 9.21307e+06 5.51059e+06 1.672
49 ToCbor/twitter ns 638321 141975 4.496
50 ParseIndented/twitter / 4 ns 3.58298e+06 1.10646e+06 3.238
51 Iterate/citm_catalog ns 297646 167302 1.779
52 FromBinaryBuffer/bjdata / canada ns 8.08015e+06 4.17334e+06 1.936
53 ParseStreamValues/ndjson ns 6.96248e+06 3.7254e+06 1.869
54 Diff/twitter ns 4.79296e+06 635531 7.542
55 Dump/citm_catalog / - ns 1.37753e+06 290658 4.739
56 FromBinaryShape/nested / bjdata ns 96017.5 37882.1 2.535
57 ToJsonStrings/copy ns 5.83243e+06 5.54046e+06 1.053
58 Dump/canada / 4 ns 8.9039e+06 2.9943e+06 2.974
59 CopyRing/twitter ns 855374 766521 1.116
60 FromBinaryBuffer/cbor / citm_catalog ns 3.70397e+06 1.46121e+06 2.535
61 FromBinaryFile/bjdata / twitter ns 1.02688e+07 1.90492e+06 5.391
62 FromBinaryShape/containers / ubjson_optimized ns 1.4727e+07 4.80309e+06 3.066
63 FromMsgpack/citm_catalog ns 8.85701e+06 2.2473e+06 3.941
64 CopyOnly/canada ns 1.53425e+06 1.49609e+06 1.026
65 Equal/canada ns 453965 332795 1.364
66 Diff/citm_catalog ns 6.74369e+06 1.07135e+06 6.295
67 ParseStringOrdered/canada ns 1.49834e+07 4.29102e+06 3.492
68 Flatten/canada ns 2.82148e+07 1.11369e+07 2.533
69 Accept/canada ns 1.26836e+07 2.25933e+06 5.614
70 CopyAssign/twitter ns 804857 735341 1.095
71 BinaryToCbor/4096 ns 402.442 159.22 2.528
72 ParseFILE/citm_catalog ns 3.45528e+07 7.26455e+06 4.756
73 ToCbor/signed_ints ns 1.13256e+07 2.76748e+06 4.092
74 Patch/canada ns 9.80719e+06 3.36006e+06 2.919
75 GetArray<std::vector<int>> ns 6589.63 655.021 10.060
76 Dump/canada / - ns 6.62927e+06 2.24661e+06 2.951
77 GetVectorDouble/floats ns 6.62214e+06 641259 10.327
78 Accept/citm_catalog ns 6.3596e+06 909397 6.993
79 ParseFILE/twitter ns 1.35627e+07 3.27982e+06 4.135
80 FromBinaryBuffer/msgpack / jeopardy ns 3.54302e+08 1.10166e+08 3.216
81 ParseFile/floats ns 1.3128e+08 4.88806e+07 2.686
82 Accept/small_signed_ints ns 5.5849e+07 1.88756e+07 2.959
83 Accept/jeopardy ns 2.2049e+08 6.3504e+07 3.472
84 Accept/signed_ints ns 1.15055e+08 2.84818e+07 4.040
85 CopyRing/canada ns 3.68758e+06 2.88527e+06 1.278
86 Patch/twitter ns 1.44963e+06 848729 1.708
87 Iterate/twitter ns 87147.2 61831.9 1.409
88 ParseFile/twitter ns 3.33795e+06 1.3545e+06 2.464
89 GetArray<std::deque<int>> ns 8110.78 1156.06 7.016
90 FromBinaryBuffer/cbor / canada ns 8.20468e+06 2.31071e+06 3.551
91 Equal/twitter ns 141057 125995 1.120
92 ParseStreamValues/numbers ns 1.87073e+06 370959 5.043
93 Dump/small_signed_ints / - ns 1.78162e+07 7.86562e+06 2.265
94 JsonPointerToString/citm_catalog ns 6.63798e+06 1.869e+06 3.552
95 Copy/twitter ns 797034 721889 1.104
96 Diff/canada ns 3.83337e+07 3.67301e+06 10.437
97 FromBinaryBuffer/ubjson_optimized / twitter ns 3.1281e+06 959992 3.258
98 BinaryToCbor/32 ns 251.857 47.32 5.322
99 GetArray<std::set<int>> ns 58113.1 40911.2 1.420
100 CopyAssign/citm_catalog ns 1.66804e+06 1.48043e+06 1.127
101 ToCbor/jeopardy ns 7.16464e+07 2.11077e+07 3.394
102 CopyRing/citm_catalog ns 1.70236e+06 1.50767e+06 1.129
103 FromBinaryBuffer/ubjson / canada ns 8.14082e+06 4.15725e+06 1.958
104 ToCbor/small_signed_ints ns 1.02087e+07 2.3872e+06 4.276
105 DestroyOnly/canada ns 2.13545e+06 1.37061e+06 1.558
106 FromBinaryBuffer/ubjson / citm_catalog ns 3.81161e+06 1.73601e+06 2.196
107 Dump/jeopardy / - ns 2.01242e+08 3.04052e+07 6.619
108 FromBinaryBuffer/msgpack / citm_catalog ns 3.70428e+06 1.42385e+06 2.602
109 ParseStringOrdered/citm_catalog ns 1.07899e+07 1.63999e+06 6.579
110 ParseString/unsigned_ints ns 1.17897e+08 3.02538e+07 3.897
111 Patch/citm_catalog ns 2.48869e+06 1.60776e+06 1.548
112 SaxParse/canada ns 1.28389e+07 3.21707e+06 3.991
113 ParseString/citm_catalog ns 7.20303e+06 1.7454e+06 4.127
114 FromBinaryFile/cbor / canada ns 1.42056e+07 4.37844e+06 3.244
115 BinaryToCbor/256 ns 269.641 86.3027 3.124
116 ParseFILE/canada ns 5.22098e+07 1.38907e+07 3.759
117 BinaryToCbor/32768 ns 1538.42 806.578 1.907
118 Accept/floats ns 1.13316e+08 2.40029e+07 4.721
119 FromMsgpack/floats ns 5.92985e+07 2.71551e+07 2.184
120 ParseString/small_signed_ints ns 6.05098e+07 2.18687e+07 2.767
121 JsonPointerParse/citm_catalog ns 5.64871e+06 2.16902e+06 2.604
122 Copy/canada ns 3.64004e+06 2.8296e+06 1.286
123 Dump/twitter / 4 ns 1.56293e+06 247785 6.308
124 FromBinaryShape/nested / msgpack ns 90351.2 34224 2.640
125 FromBinaryBuffer/ubjson_optimized / canada ns 8.36221e+06 2.82594e+06 2.959
126 JsonPointerContains/citm_catalog ns 2.71985e+06 1.23844e+06 2.196
127 FromMsgpack/small_signed_ints ns 6.27969e+07 3.33815e+07 1.881
128 DestroyOnly/twitter ns 401772 322543 1.246
129 FromBinaryShape/containers / msgpack ns 1.37471e+07 3.71417e+06 3.701
130 FromBinaryShape/scalars / msgpack ns 2.40944e+07 9.77821e+06 2.464
131 ToCbor/citm_catalog ns 1.02089e+06 257529 3.964
132 GetVectorInt/signed_ints ns 8.04308e+06 3.35704e+06 2.396
133 Accept/twitter ns 2.45943e+06 458446 5.365
134 Iterate/canada ns 861455 320474 2.688
135 ToCbor/unsigned_ints ns 7.98977e+06 2.75684e+06 2.898
136 FromBinaryShape/scalars / bjdata ns 2.43317e+07 1.12007e+07 2.172
137 BinaryToCbor/2048 ns 332.826 114.084 2.917
138 BinaryToCbor/512 ns 291.316 92.8039 3.139
139 FlattenOrdered/twitter ns 4.92534e+07 851500 57.843
140 Copy/citm_catalog ns 1.61348e+06 1.44942e+06 1.113
141 FromBinaryShape/containers / ubjson ns 1.40981e+07 6.87399e+06 2.051
142 BinaryToCbor/1024 ns 304.119 95.8643 3.172
143 FromBinaryBuffer/ubjson / twitter ns 3.12147e+06 962822 3.242
144 Dump/signed_ints / - ns 2.34455e+07 1.61521e+07 1.452
145 FromBinaryShape/scalars / cbor ns 2.54779e+07 9.63099e+06 2.645
146 FromBinaryBuffer/cbor / signed_ints ns 3.57449e+07 1.2803e+07 2.792
147 CopyOnly/citm_catalog ns 734852 783826 0.938
148 Dump/unsigned_ints / - ns 2.3437e+07 1.6565e+07 1.415
149 Accept/unsigned_ints ns 1.14173e+08 2.74092e+07 4.165
150 FromMsgpack/canada ns 1.42472e+07 4.37022e+06 3.260
151 ParseStringOrdered/twitter ns 4.32143e+06 910717 4.745
152 Dump/twitter / - ns 1.38581e+06 207620 6.675
153 BinaryToCbor/64 ns 250.506 81.5793 3.071
154 JsonPointerParse/twitter ns 2.40825e+06 979256 2.459
155 GetMap/citm_catalog ns 3.41415e+06 2.37109e+06 1.440
156 ToJsonStrings/move ns 5.83899e+06 3.02241e+06 1.932
157 FromBinaryBuffer/ubjson / jeopardy ns 3.67059e+08 1.15063e+08 3.190
158 FromBinaryShape/nested / ubjson ns 96068.6 37753.5 2.545
159 FromBinaryBuffer/bjdata / twitter ns 3.11851e+06 963022 3.238
160 FromBinaryShape/nested / cbor ns 93124.8 34434.7 2.704
161 ParseFile/citm_catalog ns 7.62707e+06 2.39694e+06 3.182
162 FromBinaryFile/ubjson / twitter ns 1.04355e+07 1.90842e+06 5.468
163 Dump/citm_catalog / 4 ns 1.92608e+06 416105 4.629
164 CopyAssign/canada ns 3.68545e+06 2.87633e+06 1.281
165 Unflatten/citm_catalog ns 9.65545e+06 3.47021e+06 2.782
166 FromBinaryBuffer/bjdata_optimized / twitter ns 3.14359e+06 967149 3.250
167 FromBinaryBuffer/cbor / floats ns 2.88404e+07 8.22731e+06 3.505
168 Equal/citm_catalog ns 264018 254367 1.038
169 FromBinaryShape/containers / cbor ns 1.38356e+07 3.8445e+06 3.599
170 Flatten/citm_catalog ns 6.43708e+06 2.96328e+06 2.172
171 FromMsgpack/twitter ns 9.69832e+06 1.46011e+06 6.642
172 FromBinaryBuffer/bson / citm_catalog ns 3.86353e+06 1.73584e+06 2.226
173 FromBinaryBuffer/msgpack / canada ns 8.21458e+06 2.2769e+06 3.608
174 GetArray<std::array<int, 1000>> ns 2228.17 630.225 3.536
175 SaxParse/twitter ns 2.4729e+06 472447 5.234
176 ParseString/canada ns 1.50552e+07 4.35028e+06 3.461
177 ParseFile/canada ns 1.79247e+07 6.11532e+06 2.931
178 ParseFile/unsigned_ints ns 1.22099e+08 4.40082e+07 2.774
179 FromCborChunkedString/10000 chunks ns 89638.1 81306.2 1.102
180 FromBinaryShape/nested / bson ns 102178 46148.5 2.214
181 ParseIndented/citm_catalog / 4 ns 7.27956e+06 1.75204e+06 4.155
182 Dump/unsigned_ints / 4 ns 3.15101e+07 1.7373e+07 1.814
183 FromBinaryBuffer/bjdata_optimized / canada ns 8.52567e+06 2.93164e+06 2.908
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+344 -97
View File
@@ -3,22 +3,24 @@
Generated files:
- perf_blog_overview.svg: speedup of 3.13.0 over 3.12.0 per workload (Google Benchmark suite)
- perf_blog_distribution.svg: how many of the suite's benchmarks got how much faster (data/perf_suite.csv)
- perf_blog_timeline_<workload>.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_cliffs.svg: operations that were quadratic or worse, 3.12.0 against 3.13.0 (log scale)
- perf_blog_view.svg: parse throughput of json_document and six other document parsers
- perf_blog_view_dump.svg: write throughput of the same engines, each writing a document parsed beforehand
- perf_blog_usecases_<platform>.svg: libraries x use cases, time relative to the fastest fully validating library
(data/perf_usecases_<platform>.json); perf_blog_tables.py prints the tables of the appendix from the same data
The numbers are copied from the tables of the post (the timeline from data/perf_timeline.csv, which
`tests/benchmarks/history/history.py summarize` writes); the tables stay on the page as the accessible fallback. Update both together.
Like the figures of charts.py, the SVGs are not images: the page includes their text with
`--8<-- "images/<name>.svg"`, so they follow the colours and fonts of the page (`nj-charts` rules in
`--8<-- "images/<name>.svg"`, so they follow the colors and fonts of the page (`nj-charts` rules in
docs/css/fig-charts.css, `nj-fig` rules in docs/css/brand.css). Run `python3 scripts/figures/perf_blog.py` from
docs/mkdocs after changing data or drawing, and commit the generated files.
"""
import csv
import html
import json
import math
import re
from pathlib import Path
@@ -29,7 +31,8 @@ MINUS = "&#8722;"
TIMES = "&#215;"
# words the abbreviation extension (includes/glossary.md) would wrap in <abbr> inside the SVG text
ABBR = re.compile(r"(?<![\w;])(BJData|BON8|BSON|CBOR|GCC|UBJSON|MsgPack|JSON|DOM|SAX|SIMD|UTF|ASCII)(?!\w)")
GLOSSARY = re.findall(r"^\*\[([^\]]+)\]", (HERE.parents[1] / "includes" / "glossary.md").read_text(), re.M)
ABBR = re.compile(r"(?<![\w;])(%s)(?!\w)" % "|".join(sorted(map(re.escape, GLOSSARY), key=len, reverse=True)))
def protect(text):
@@ -140,7 +143,7 @@ def overview():
hi = max(v for _, _, v in OVERVIEW)
hi = math.ceil(hi + 0.5)
X = lambda v: L + v / hi * (R - L)
pitch, bh, top = 24, 15, 34
pitch, bh, top = 24, 15, 8
b, desc = [], []
y = top
group = None
@@ -165,23 +168,66 @@ def overview():
desc.append("%s %s" % (label, fx(v).replace(TIMES, "x")))
b.append('<line class="nj-charts-ref" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (X(1), top, X(1), axis_y))
b.append('<line class="nj-charts-zero" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (X(0), top, X(0), axis_y))
b.append('<text class="nj-charts-note" x="%g" y="%g">speedup over 3.12.0, more is better (the line at 1%s is 3.12.0)</text>' % (L, 18, TIMES))
write("perf_blog_overview.svg", W, axis_y + 28, "nj-charts--blog", "nj-blog-overview",
b.append('<text class="nj-charts-tick" x="%g" y="%g">speedup over 3.12.0 (3.12.0 = 1%s), more is better</text>'
% ((L + R) / 2, axis_y + 34, TIMES))
write("perf_blog_overview.svg", W, axis_y + 44, "nj-charts--blog", "nj-blog-overview",
"Speedup of 3.13.0 over 3.12.0 per workload, Apple M1 Max, Apple clang",
"Horizontal bars of the speedup, more is better. " + "; ".join(desc) + ".", b)
# ---------- distribution: how many of the suite's benchmarks got how much faster ----------
# bins of the speedup (3.12.0 time / 3.13.0 time) over all rows of data/perf_suite.csv
BINS = [(0, 1, "below 1" + TIMES), (1, 1.5, "1 to 1.5" + TIMES), (1.5, 2, "1.5 to 2" + TIMES),
(2, 3, "2 to 3" + TIMES), (3, 5, "3 to 5" + TIMES), (5, 10, "5 to 10" + TIMES), (10, 1e9, "10" + TIMES + " or more")]
def distribution():
rows = list(csv.DictReader((HERE / "data" / "perf_suite.csv").open()))
s = sorted(float(r["speedup"]) for r in rows)
n = len(s)
counts = [sum(lo <= v < hi for v in s) for lo, hi, _ in BINS]
geo = math.exp(sum(math.log(v) for v in s) / n)
med = (s[(n - 1) // 2] + s[n // 2]) / 2
W, H = 560, 250
L, R, T, B = 52, 548, 16, 196
hi = 10 * math.ceil(max(counts) / 10 + 0.4)
Y = lambda c: B - c / hi * (B - T)
slot = (R - L) / len(BINS)
b, desc = [], []
for t in range(0, hi + 1, 20):
b.append('<line class="nj-charts-grid" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (L, Y(t), R, Y(t)))
b.append('<text class="nj-charts-tick nj-charts-tick--r" x="%g" y="%g">%d</text>' % (L - 6, Y(t) + 4, t))
for k, ((lo, _, label), c) in enumerate(zip(BINS, counts)):
x = L + k * slot + 8
w = slot - 16
cls = "nj-charts-c2" if lo < 1 else "nj-charts-c1"
b.append('<rect class="%s" x="%.1f" y="%.1f" width="%.1f" height="%.1f" rx="3"><title>%s: %d</title></rect>'
% (cls, x, Y(c), w, B - Y(c), label, c))
b.append('<text class="nj-charts-val" x="%.1f" y="%.1f" text-anchor="middle">%d</text>' % (x + w / 2, Y(c) - 5, c))
b.append('<text class="nj-charts-tick" x="%.1f" y="%.1f">%s</text>' % (x + w / 2, B + 16, label))
desc.append("%s: %d" % (label.replace(TIMES, "x"), c))
b.append('<line class="nj-charts-axis" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (L, B, R, B))
b.append('<text class="nj-charts-tick" x="%g" y="%g">speedup over 3.12.0, more is better</text>' % ((L + R) / 2, H - 10))
b.append('<text class="nj-charts-tick" transform="rotate(-90)" x="%g" y="14">number of benchmarks</text>' % (-(T + B) / 2))
print("distribution: median %s, geometric mean %s" % (fx(med), fx(geo)))
write("perf_blog_distribution.svg", W, H, "nj-charts--blog", "nj-blog-dist",
"Speedup of 3.13.0 over 3.12.0 for all %d benchmarks of the suite" % n,
"Bars counting the benchmarks per speedup range: " + "; ".join(desc)
+ ". Median %s, geometric mean %s." % (fx(med).replace(TIMES, "x"), fx(geo).replace(TIMES, "x")), b)
# ---------- timeline: one panel per workload ----------
# (column in perf_timeline.csv, panel title, [PR numbers to label])
# (column in perf_timeline.csv, panel title, [(PR, label)]): each labeled step shows the number of the theme that
# explains it ("U" for the UTF-8 check of the binary readers that came and went); the appendix maps steps to PRs
TIMELINE = [
("parse_citm", "parse() citm_catalog.json", [5234, 5283, 5592, 5809, 5810, 5882]),
("parse_canada", "parse() canada.json", [5234, 5283, 5617, 5738, 5851, 5882]),
("accept_twitter", "accept() twitter.json", [5234, 5283, 5592, 5809, 5810, 5853]),
("parse_twitter_ifstream", "parse() twitter.json, std::ifstream", [5828, 5884]),
("dump_twitter", "dump() twitter.json", [5285, 5738, 5878, 5883]),
("dump_canada", "dump() canada.json", [5285, 5634]),
("from_cbor_twitter", "from_cbor() twitter", [5233, 5501, 5185, 5746]),
("to_cbor_twitter", "to_cbor() twitter", [5328, 5824, 5885]),
("parse_citm", "parse() citm_catalog.json", [(5234, "4"), (5283, "1"), (5592, "4"), (5809, "4"), (5810, "2"), (5882, "4")]),
("parse_canada", "parse() canada.json", [(5234, "4"), (5283, "1"), (5617, "3"), (5738, "3"), (5851, "3"), (5882, "4")]),
("accept_twitter", "accept() twitter.json", [(5234, "4"), (5283, "1"), (5592, "4"), (5809, "4"), (5810, "2"), (5853, "2")]),
("parse_twitter_ifstream", "parse() twitter.json, std::ifstream", [(5828, "1"), (5884, "1")]),
("dump_twitter", "dump() twitter.json", [(5285, "6"), (5738, "2"), (5878, "2"), (5883, "2")]),
("dump_canada", "dump() canada.json", [(5285, "6"), (5634, "3")]),
("from_cbor_twitter", "from_cbor() twitter", [(5233, "1"), (5501, "4"), (5185, "U"), (5746, "U")]),
("to_cbor_twitter", "to_cbor() twitter", [(5328, "4"), (5824, "6"), (5885, "6")]),
]
MONTHS = [("2025-04", "3.12.0"), ("2026-09", "Sep 2026"), ("2026-10", "Oct")]
@@ -190,7 +236,7 @@ def timeline():
rows = list(csv.DictReader((HERE / "data" / "perf_timeline.csv").open()))
n = len(rows)
W, H = 340, 270
L, R, T, B = 44, 330, 62, 208
L, R, T, B = 44, 330, 66, 208
for col, title, labels in TIMELINE:
vals = [float(r[col]) if r[col] else None for r in rows]
base = vals[0]
@@ -227,35 +273,38 @@ def timeline():
# labels for named steps: a dot at the commit and its PR number above it; PRs a few commits apart share a
# label, and a label that would overlap one already placed moves up
groups = []
for pr in labels:
for pr, lab in labels:
i = next(k for k, r in enumerate(rows) if r["pr"] == str(pr))
if groups and X(i) - X(groups[-1][-1][1]) < 6:
groups[-1].append((pr, i))
groups[-1].append((pr, i, lab))
else:
groups.append([(pr, i)])
groups.append([(pr, i, lab)])
# labels in two rows above the plot, each with a guide down to its dot
placed = []
for g in groups:
i = g[-1][1]
x, y = X(i), Y(rel[i])
for pr, k in g:
for pr, k, lab in g:
b.append('<circle class="nj-charts-json-dot" cx="%.1f" cy="%.1f" r="3.5"><title>#%s: %s</title></circle>'
% (X(k), Y(rel[k]), pr, fx(rel[k])))
text = ", ".join("#%s" % pr for pr, _ in g)
w = 7.2 * len(text)
marks = list(dict.fromkeys(lab for _, _, lab in g))
w = 18 * len(marks) - 3
tx = min(max(x, L + w / 2), R - w / 2)
row = 0
while any(r == row and abs(tx - px) < (w + pw) / 2 + 4 for px, r, pw in placed):
row += 1
placed.append((tx, row, w))
ty = 50 - 13 * row
b.append('<line class="nj-charts-grid" stroke-dasharray="2 2" x1="%.1f" y1="%.1f" x2="%.1f" y2="%.1f"/>' % (x, ty + 4, x, y - 5))
b.append('<text class="nj-charts-note" x="%.1f" y="%.1f" text-anchor="middle">%s</text>' % (tx, ty, text))
ty = 46 - 18 * row # the center of the badges
b.append('<line class="nj-charts-grid" stroke-dasharray="2 2" x1="%.1f" y1="%.1f" x2="%.1f" y2="%.1f"/>' % (x, ty + 8, x, y - 5))
for k, mark in enumerate(marks):
cx = tx - w / 2 + 7.5 + 18 * k
b.append('<circle class="nj-theme-dot%s" cx="%.1f" cy="%.1f" r="7.5"/>' % ("" if mark.isdigit() else " nj-theme-dot--other", cx, ty))
b.append('<text class="nj-theme-num" x="%.1f" y="%.1f" text-anchor="middle">%s</text>' % (cx, ty + 4, mark))
b.append('<line class="nj-charts-axis" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (L, B, R, B))
b.append('<text class="nj-charts-note" x="%g" y="%g">speedup over 3.12.0 (log scale), more is better</text>' % (8, H - 8))
final = rel[-1]
desc = ("%s: speedup over 3.12.0 at each of %d commits, ending at %s. Labeled steps: %s."
% (title, n, fx(final).replace(TIMES, "x"), ", ".join("#%s" % p for p in labels)))
desc = ("%s: speedup over 3.12.0 at each of %d commits, ending at %s. Labeled steps, by theme: %s."
% (title, n, fx(final).replace(TIMES, "x"), ", ".join(lab for _, lab in labels)))
write("perf_blog_timeline_%s.svg" % col, W, H, "nj-charts--timeline", "nj-blog-tl-" + col,
"%s: speedup over 3.12.0 by commit" % title, desc, b)
@@ -266,8 +315,8 @@ CLIFFS = [
("diff() 64k numbers vs []", 4102, 9.98),
("diff() 20k objects vs half", 119, 3.85),
("parse() callback, 32k objects", 1334, 11.5),
("< nested 24 deep", 62.6, 0.002),
("< citm, 10x", 274, 3.81),
("operator< nested 24 deep", 62.6, 0.002),
("operator< citm, 10x", 274, 3.81),
("flatten() citm, ordered_json", 253, 1.37),
("to_bson() 200 deep, 100x", 19.5, 0.566),
("push_back() 100k, diagnostics", 1514, 4.98),
@@ -306,84 +355,282 @@ 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)
# ---------- json_view: parse throughput ----------
# engines and GB/s per file, copied from the table in "Build a different data structure"
VIEW_FILES = ["twitter.json", "citm_catalog.json", "canada.json", "jeopardy.json"]
VIEW_BYTES = [631514, 1727204, 2251051, 55554625]
VIEW_US = [ # (engine, css class, [µs per file]), fresh documents, from the table in "How it compares"
("nlohmann/json json_document", "nj-charts-c1", [183, 364, 943, 22681]),
("yyjson", "nj-charts-c2", [194, 478, 1489, 30342]),
("simdjson DOM", "nj-charts-c3", [202, 486, 2097, 26904]),
("sonic-rs (Rust)", "nj-charts-c4", [302, 664, 1907, 30202]),
("sonic-cpp", "nj-charts-c5", [379, 986, 2580, 40804]),
("Boost.JSON", "nj-charts-c6", [868, 1483, 2481, 88925]),
("nlohmann/json json::parse", "nj-charts-c1 nj-charts-dim", [1352, 2386, 5915, 163750]),
# ---------- 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)
PRICE = [
("Apple clang 21, -O0 (debug)", [("count_numbers", 959.1, 1155.3, 679.1, 803.9), ("server_config", 1108.2, 1445.1, 763.1, 1057.0)]),
("Apple clang 21, -O2", [("count_numbers", 1268.8, 1867.7, 1364.3, 1512.9), ("server_config", 1576.9, 2353.6, 1749.4, 2141.4)]),
("GCC 16, -O0 (debug)", [("count_numbers", 1443.7, 2346.4, 1579.2, 1662.5), ("server_config", 1984.8, 2781.7, 2113.3, 2181.1)]),
("GCC 16, -O2", [("count_numbers", 2326.9, 3453.3, 2972.4, 2895.3), ("server_config", 2888.7, 4388.6, 3941.8, 3825.5)]),
]
VIEW = [(e, c, [n / (t * 1000) for n, t in zip(VIEW_BYTES, us)]) for e, c, us in VIEW_US] # GB/s
# dump: the bytes of the compact output, and the same engines, from the dump table in "How it compares"
DUMP_BYTES = [466906, 500299, 2090234, 52508728]
DUMP_US = [
("nlohmann/json json_document", "nj-charts-c1", [74.5, 132.8, 1625.1, 14757.2]),
("yyjson", "nj-charts-c2", [104.2, 165.7, 1715.7, 20133.5]),
("simdjson DOM", "nj-charts-c3", [354.2, 498.2, 6816.1, 54833.4]),
("sonic-rs (Rust)", "nj-charts-c4", [212.6, 443.9, 2416.8, 33818.5]),
("sonic-cpp", "nj-charts-c5", [104.6, 222.3, 3044.2, 19836.1]),
("Boost.JSON", "nj-charts-c6", [497.6, 501.4, 2941.8, 63392.3]),
("nlohmann/json json::dump", "nj-charts-c1 nj-charts-dim", [216.7, 285.5, 2244.0, 31205.3]),
]
DUMP = [(e, c, [n / (t * 1000) for n, t in zip(DUMP_BYTES, us)]) for e, c, us in DUMP_US] # GB/s
PRICE_SERIES = [("3.13.0", "nj-charts-c2"), ("3.13.0, precompiled header", "nj-charts-c1"), ("3.13.0, module", "nj-charts-c3")]
def view(VIEW=VIEW, name="perf_blog_view.svg", tid="nj-blog-view",
title="Parse throughput of nlohmann/json's json_document and json::parse and five other document parsers, fresh documents, Apple M1 Max",
what="parse"):
W, L, R = 580, 142, 545
hi = max(max(v) for _, _, v in VIEW)
hi = math.ceil(hi * 2) / 2
X = lambda v: L + v / hi * (R - L)
bh, gap = 9, 2
group_h = len(VIEW) * (bh + gap) + 14
def price():
W, L, R = 600, 150, 560
lo, hi = -50, 70
X = lambda pct: L + (pct - lo) / (hi - lo) * (R - L)
pct = lambda new, old: round((new / old - 1) * 100)
lab = lambda p: (MINUS + "%d %%" % -p) if p < 0 else "+%d %%" % p
bh, pitch, gap = 11, 14, 10
b, desc = [], []
x, ly = 8, 10
for j, (eng, cls, _) in enumerate(VIEW):
w = 18 + 7.4 * len(eng) + 16
if x + w > W:
x, ly = 8, ly + 20
b.append('<rect class="%s" x="%g" y="%g" width="12" height="12" rx="3"/>' % (cls, x, ly))
b.append('<text class="nj-charts-leg" x="%g" y="%g">%s</text>' % (x + 18, ly + 10.5, esc(eng)))
x += w
top = ly + 34 # below the last row of the legend
axis_y = top + group_h * len(VIEW_FILES)
t = 0.5
while t <= hi + 1e-9:
b.append('<line class="nj-charts-grid" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (X(t), top - 4, X(t), axis_y))
b.append('<text class="nj-charts-tick" x="%g" y="%g">%g</text>' % (X(t), axis_y + 16, t))
t += 0.5
b.append('<text class="nj-charts-tick" x="%g" y="%g">GB/s, more is better</text>' % ((L + R) / 2, axis_y + 34))
for i, f in enumerate(VIEW_FILES):
y0 = top + i * group_h
b.append('<text class="nj-charts-rowlabel" x="%g" y="%g" text-anchor="end">%s</text>' % (L - 8, y0 + group_h / 2, esc(f)))
for j, (eng, cls, vals) in enumerate(VIEW):
y = y0 + j * (bh + gap)
b.append('<path class="%s" d="%s"><title>%s, %s: %.2f GB/s</title></path>' % (cls, hbar(X(0), X(vals[i]), y, bh), esc(eng), esc(f), vals[i]))
b.append('<text class="nj-charts-val" x="%g" y="%g">%.2f</text>' % (X(vals[i]) + 4, y + bh - 1.5, vals[i]))
desc.append("%s %s %.2f GB/s" % (f, eng, vals[i]))
b.append('<line class="nj-charts-zero" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (X(0), top - 4, X(0), axis_y))
write(name, W, axis_y + 44, "nj-charts--blog", tid, title,
"Grouped horizontal bars of %s throughput in GB/s, more is better. " % what + "; ".join(desc) + ".", b)
# the key above the plot
x = 8
for name, cls in PRICE_SERIES:
b.append('<rect class="%s" x="%g" y="6" width="12" height="12" rx="3"/>' % (cls, x))
b.append('<text class="nj-charts-leg" x="%g" y="16.5">%s</text>' % (x + 18, esc(name)))
x += 18 + 8.2 * len(name) + 22
top = 54
b.append('<text class="nj-charts-tick" x="%g" y="%g">as fast as 3.12.0</text>' % (X(0), top - 8))
y = top
for build, progs in PRICE:
b.append('<text class="nj-charts-panel" x="8" y="%g">%s</text>' % (y + 14, esc(build)))
y += 24
y0, at = y, len(b)
for prog, old, *new in progs:
b.append('<text class="nj-charts-rowlabel nj-charts-code" x="%g" y="%g" text-anchor="end">%s</text>'
% (L - 8, y + 1.5 * pitch + 2, prog))
for (name, cls), t in zip(PRICE_SERIES, new):
p = pct(t, old)
b.append('<path class="%s" d="%s"><title>%s, %s, %s: %s ms against %s ms with 3.12.0 (%s)</title></path>'
% (cls, hbar(X(0), X(p), y, bh), prog, esc(build), esc(name), format(round(t), ","), format(round(old), ","), lab(p)))
if p < 0:
b.append('<text class="nj-charts-val" x="%g" y="%g" text-anchor="end">%s</text>' % (X(p) - 5, y + bh - 1.5, lab(p)))
else:
b.append('<text class="nj-charts-val" x="%g" y="%g">%s</text>' % (X(p) + 5, y + bh - 1.5, lab(p)))
desc.append("%s, %s, %s: %s" % (build, prog, name, lab(p).replace(MINUS, "-")))
y += pitch
y += gap - (pitch - bh)
# the grid behind this panel's bars only, so that it doesn't cross the panel titles
b[at:at] = ['<line class="nj-charts-grid" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (X(t), y0 - 4, X(t), y - gap + 4)
for t in range(lo + 10, hi + 1, 20) if t]
y += 8
axis_y = y
b.append('<line class="nj-charts-ref" x1="%g" y1="%g" x2="%g" y2="%g"/>' % (X(0), top - 2, X(0), axis_y))
for t in range(lo + 10, hi + 1, 20):
b.append('<text class="nj-charts-tick" x="%g" y="%g">%s</text>' % (X(t), axis_y + 16, "0" if t == 0 else lab(t)))
b.append('<text class="nj-charts-tick" x="%g" y="%g">compile time compared with 3.12.0, less is better</text>' % ((L + R) / 2, axis_y + 34))
write("perf_blog_price.svg", W, axis_y + 44, "nj-charts--blog", "nj-blog-price",
"Compile time of two programs with 3.13.0, alone, with a precompiled header and as a module, compared with 3.12.0",
"Horizontal bars of the change in compile time against 3.12.0, less is better. " + "; ".join(desc) + ".", b)
# ---------- use cases: libraries x use cases, relative time ----------
# data/perf_usecases_<platform>.json is written by tests/benchmarks/json_view/others/summarize.py --json
UC_FILES = ["twitter", "citm_catalog", "canada", "jeopardy"]
USE_CASES = [("validate", "validate"), ("sum", "sum"), ("select", "select"),
("edit", "edit"), ("minify", "minify"), ("write", "write")]
UC_LIBS = { # library in the JSON -> row label
"nlohmann json_document": "nlohmann/json json_document", "nlohmann json": "nlohmann/json json",
"yyjson": "yyjson", "simdjson": "simdjson", "sonic-cpp": "sonic-cpp", "Glaze": "Glaze", "Boost.JSON": "Boost.JSON",
"RapidJSON": "RapidJSON", "sonic-rs": "sonic-rs (Rust)", "simd-json": "simd-json (Rust)", "serde_json": "serde_json (Rust)",
}
UC_PLATFORMS = [("mac", "Use cases: time of each library relative to the fastest, Apple M1 Max"),
("x86-gcc", "Use cases: time of each library relative to the fastest, x86-64 with GCC 16.2"),
("x86-gcc13", "Use cases: time of each library relative to the fastest, x86-64 with GCC 13"),
("x86-clang", "Use cases: time of each library relative to the fastest, x86-64 with Clang 23")]
LEVEL_MARK = {"no UTF-8": "U", "partial": "P", "full": ""}
# why a cell is empty (the tooltips of the n/a cells)
NA = {("simdjson", "edit"): "simdjson's documents are read-only: it has no API to change a value and write the result"}
def geomean(xs):
return math.exp(sum(math.log(x) for x in xs) / len(xs))
def normalize_usecases(data):
"""Chooses each library's best variants again with the rules of the post: variants that copy each number's text
instead of formatting it (json_document's number_format::source, RapidJSON's raw numbers) and variants that reuse
a parser or document across calls are measured but not chosen"""
data = json.loads(json.dumps(data))
rank = {"full": 0, "n/a": 0, "no UTF-8": 1, "partial": 2}
for files in data.values():
for cell in files.values():
for e in cell.values():
vs = [(v["us"], k, v["level"]) for k, v in e["variants"].items()
if not any(w in k for w in ("source numbers", "raw numbers", "reused"))]
full = [v for v in vs if rank[v[2]] == 0]
pick = lambda v: {"us": v[0], "variant": v[1], "level": "full" if rank[v[2]] == 0 else v[2]}
e["best"] = pick(min(full)) if full else None
e["best_any"] = pick(min(vs))
return data
FILE_NAMES = {"twitter": "twitter.json", "citm_catalog": "citm_catalog.json", "canada": "canada.json",
"jeopardy": "jeopardy.json"}
# what a variant that checks less skips, worded as the trade it is (the tooltips of the heatmaps)
CHECKS_LESS = [
("simdjson", "On-Demand", "reads lazily: On-Demand reads only what you ask for and steps over the rest by matching brackets"),
("simdjson", "minify", "simdjson::minify() only removes whitespace, without parsing the values"),
("Glaze", "lazy_json", "reads lazily: lazy_json reads only what you ask for and steps over the rest"),
("Glaze", "minify_json", "minify_json only removes whitespace, without parsing the values"),
("Glaze", "structs", "reads into structs and steps over fields it doesn't know without checking them "
"(validate_skipped checks them too)"),
("RapidJSON", "", "trusts UTF-8: RapidJSON's default (kParseValidateEncodingFlag checks it)"),
("sonic-cpp", "", "trusts UTF-8: sonic-cpp 1.0.2 doesn't check it"),
("serde_json", "", "trusts UTF-8 in the strings it skips (from_slice); strings it reads are checked"),
]
def checks_less(lib, variant):
for l, v, text in CHECKS_LESS:
if l == lib and v in variant:
return text
return "checks less"
def usecase_table(data):
"""{library: {use case: cell}}: per library the geometric mean over UC_FILES of its fastest fully validating time
("full") and of its fastest time at any level ("alt", only if it is at least 3 % faster), each divided by the best
such fully validating mean in the use case, so that every file counts equally and the fastest library is 1.00"""
out = {}
data = normalize_usecases(data)
for uc, _ in USE_CASES:
files = data.get(uc, {})
if not files:
continue
cells = {}
for lib in UC_LIBS:
es = [files.get(f, {}).get(lib) for f in UC_FILES]
if not all(es):
continue
full = [e["best"] for e in es]
alt = [e["best_any"] for e in es]
cells[lib] = {"full": geomean([b["us"] for b in full]) if all(full) else None, "alt": geomean([a["us"] for a in alt]),
"files": [(f, b, a) for f, b, a in zip(UC_FILES, full, alt)]}
ref = min(c["full"] for c in cells.values() if c["full"])
for lib, c in cells.items():
full = c["full"] / ref if c["full"] else None
alt = c["alt"] / ref
if full is not None and alt > full * 0.97:
alt = None
levels = {a["level"] for _, _, a in c["files"]} if alt is not None else set()
level = "partial" if "partial" in levels else "no UTF-8" if "no UTF-8" in levels else "full"
out.setdefault(lib, {})[uc] = {"full": full, "alt": alt, "level": level, "files": c["files"]}
return out
# cell colors: green for the fastest, gray around twice the time, red for the slowest; the upper bounds of the steps
HEAT_STEPS = [1.15, 1.5, 2.5, 5, float("inf")]
HEAT_LABELS = ["below 1.15", "1.15 to 1.5", "1.5 to 2.5", "2.5 to 5", "5 and more"]
def heat(r):
return next(i for i, b in enumerate(HEAT_STEPS) if r < b)
def fr(r):
return "%.2f" % r if r < 9.995 else "%.1f" % r if r < 99.95 else "%.0f" % r
def fus(us):
return "{:,.0f} µs".format(us) if us >= 100 else "%.1f µs" % us
def tip(lib, uc_label, c, half):
"""the tooltip of a cell: lines separated by newlines (&#10; in the attribute), the first one the heading"""
if half == "full":
lines = ["%s · %s" % (UC_LIBS[lib], uc_label),
"%s× the time of the fastest library (fully validating)" % fr(c["full"])]
picks = [(f, b) for f, b, _ in c["files"]]
else:
lines = ["%s · %s, checking less" % (UC_LIBS[lib], uc_label),
"%s× the time of the fastest fully validating library" % fr(c["alt"])]
picks = [(f, a) for f, _, a in c["files"]]
ways = sorted({e["variant"] for _, e in picks})
if len(ways) == 1:
lines.append("way: %s" % ways[0])
for f, e in picks:
lines.append("%s: %s%s%s" % (FILE_NAMES[f], fus(e["us"]), "" if len(ways) == 1 else " · " + e["variant"],
" (validates fully)" if half == "alt" and e["level"] == "full" else ""))
if half == "alt":
seen = []
for _, e in picks:
if e["level"] != "full":
t = checks_less(lib, e["variant"])
if t not in seen:
seen.append(t)
lines += seen
if any("(copy)" in e["variant"] for _, e in picks):
lines.append("(copy): parses in place, on a copy of the input that is part of the time")
return "&#10;".join(lines)
def heatmap(platform, title):
data = json.load((HERE / "data" / ("perf_usecases_%s.json" % platform)).open())
t = usecase_table(data)
libs = [l for l in UC_LIBS if l in t]
score = lambda l: geomean([v["full"] if v["full"] else v["alt"] * 1.5 for v in t[l].values()])
libs.sort(key=score)
W, L, cw, ch, top = 784, 224, 92, 36, 44
b, desc = [], []
for j, (uc, label) in enumerate(USE_CASES):
b.append('<text class="nj-charts-tick" x="%g" y="%g">%s</text>' % (L + j * cw + cw / 2, top - 10, esc(label)))
for i, lib in enumerate(libs):
y = top + i * ch
cls = "nj-charts-name-json" if lib.startswith("nlohmann") else ""
b.append('<text class="nj-charts-rowlabel %s" x="%g" y="%g" text-anchor="end">%s</text>' % (cls, L - 8, y + ch / 2 + 4, esc(UC_LIBS[lib])))
for j, (uc, label) in enumerate(USE_CASES):
x = L + j * cw
c = t[lib].get(uc)
if c is None:
b.append('<g class="nj-heat-cell" tabindex="0" data-tip="%s">' % esc("%s · %s&#10;%s" % (UC_LIBS[lib], label, NA.get((lib, uc), "the library has no API for this use case"))))
b.append('<rect class="nj-heat-na" x="%g" y="%g" width="%g" height="%g" rx="3"/>' % (x + 1, y + 1, cw - 2, ch - 2))
b.append('<text class="nj-charts-tick" x="%g" y="%g">n/a</text>' % (x + cw / 2, y + ch / 2 + 4))
b.append('</g>')
desc.append("%s %s: n/a" % (UC_LIBS[lib], label))
continue
halves = []
if c["full"] is not None:
halves.append(("full", c["full"]))
if c["alt"] is not None:
halves.append(("alt", c["alt"]))
hw = (cw - 2) / len(halves)
for k, (half, r) in enumerate(halves):
hx = x + 1 + k * hw
gap = 1 if len(halves) == 2 else 0
b.append('<g class="nj-heat-cell" tabindex="0" data-tip="%s">' % esc(tip(lib, label, c, half)))
b.append('<rect class="nj-heat-%d" x="%g" y="%g" width="%g" height="%g" rx="3"/>'
% (heat(r), hx + (gap if k else 0), y + 1, hw - gap, ch - 2))
cx = hx + hw / 2
if half == "alt":
b.append('<text class="nj-charts-cell" x="%g" y="%g" text-anchor="middle">%s</text>' % (cx, y + 16, fr(r)))
b.append('<text class="nj-charts-cell nj-charts-cell--small" x="%g" y="%g" text-anchor="middle">%s</text>'
% (cx, y + 29, LEVEL_MARK[c["level"]]))
else:
b.append('<text class="nj-charts-cell" x="%g" y="%g" text-anchor="middle">%s</text>' % (cx, y + ch / 2 + 4, fr(r)))
b.append('</g>')
if c["full"] is None: # no fully validating way: the left half stays empty
pass
desc.append("%s %s: %s%s" % (UC_LIBS[lib], label, fr(c["full"]) if c["full"] else "no fully validating way",
(" (%s checking less, %s)" % (fr(c["alt"]), c["level"])) if c["alt"] else ""))
# the key, set apart from the grid and narrower than its columns, so that it doesn't read as a row of it
yb = top + len(libs) * ch + 28
b.append('<text class="nj-charts-tick nj-charts-tick--l" x="8" y="%g">time relative to the fastest fully validating library, less is better</text>' % (yb + 4))
kw, ky = 76, yb + 14
for i, lab in enumerate(HEAT_LABELS):
# each swatch in its own group, so that the ink rule for the strong steps (a sibling selector) stays inside it
b.append('<g><rect class="nj-heat-%d" x="%g" y="%g" width="%g" height="20" rx="3"/>' % (i, 8 + i * (kw + 4), ky, kw))
b.append('<text class="nj-charts-cell nj-charts-cell--small" x="%g" y="%g" text-anchor="middle">%s</text></g>' % (8 + i * (kw + 4) + kw / 2, ky + 14, esc(lab)))
nx = 8 + len(HEAT_LABELS) * (kw + 4) + 12
b.append('<rect class="nj-heat-na" x="%g" y="%g" width="%g" height="20" rx="3"/>' % (nx, ky, 40))
b.append('<text class="nj-charts-tick" x="%g" y="%g">n/a</text>' % (nx + 20, ky + 14))
b.append('<text class="nj-charts-tick nj-charts-tick--l" x="%g" y="%g">no API for it</text>' % (nx + 48, ky + 14))
write("perf_blog_usecases_%s.svg" % platform, W, ky + 28, "nj-charts--blog nj-charts--heat", "nj-blog-uc-" + platform, title,
"Table of relative times, libraries by use case. " + "; ".join(desc) + ".", b)
if __name__ == "__main__":
swar()
if OVERVIEW:
overview()
distribution()
if TIMELINE:
timeline()
if CLIFFS:
cliffs()
if VIEW:
view()
if DUMP:
view(DUMP, "perf_blog_view_dump.svg", "nj-blog-view-dump",
"Write throughput of nlohmann/json's json_document and json, and five other libraries, each writing a "
"document parsed beforehand, Apple M1 Max", "write")
price()
for platform, title in UC_PLATFORMS:
if (HERE / "data" / ("perf_usecases_%s.json" % platform)).exists():
heatmap(platform, title)
@@ -0,0 +1,67 @@
"""Prints the tables of Appendix E of home/blog/how_3_13_0_got_faster.md (comparison with other libraries) as Markdown,
from data/perf_usecases_<platform>.json, which tests/benchmarks/json_view/others/summarize.py --json writes.
Usage: python3 scripts/figures/perf_blog_tables.py <platform> [title]
"""
import json
import sys
from pathlib import Path
from perf_blog import normalize_usecases
HERE = Path(__file__).resolve().parent
FILES = [("twitter", "`twitter.json`"), ("citm_catalog", "`citm_catalog.json`"), ("canada", "`canada.json`"),
("jeopardy", "`jeopardy.json`"), ("status", "one status (2.5 KB)")]
USE_CASES = [("validate", "validate"), ("sum", "sum"), ("select", "select"), ("edit", "edit"), ("minify", "minify"),
("write", "write")]
NAMES = {"nlohmann json_document": "nlohmann/json `json_document`", "nlohmann json": "nlohmann/json `json`",
"sonic-rs": "sonic-rs (Rust)", "simd-json": "simd-json (Rust)", "serde_json": "serde_json (Rust)"}
MARK = {"no UTF-8": "U", "partial": "P"}
def fmt(us):
if us >= 10000:
return "{:,.0f}".format(us)
if us >= 100:
return "{:,.0f}".format(us)
return "%.1f" % us
def table(data, uc, indent):
files = [f for f, _ in FILES if f in data.get(uc, {})]
libs = list(data[uc][files[0]].keys())
jd = lambda f: data[uc][f]["nlohmann json_document"]["best"]["us"]
libs.sort(key=lambda l: sum(((data[uc][f][l]["best"] or data[uc][f][l]["best_any"])["us"] / jd(f)) for f in files))
head = "| library | variant | " + " | ".join(n for f, n in FILES if f in files) + " |"
rows = [head, "| --- | --- | " + " | ".join("--:" for _ in files) + " |"]
for lib in libs:
best = [data[uc][f][lib]["best"] for f in files]
anyv = [data[uc][f][lib]["best_any"] for f in files]
names = sorted({b["variant"] for b in best if b} | {a["variant"] + " [%s]" % MARK[a["level"]] for b, a in zip(best, anyv) if a["level"] in MARK and (not b or a["us"] < b["us"])})
cells = []
for b, a in zip(best, anyv):
c = fmt(b["us"]) if b else "–"
if a["level"] in MARK and (not b or a["us"] < b["us"] * 0.97):
c += " (%s %s)" % (MARK[a["level"]], fmt(a["us"]))
cells.append(c)
bold = "**%s**" if lib == "nlohmann json_document" else "%s"
rows.append("| %s | %s | %s |" % (bold % NAMES.get(lib, lib), ", ".join(names), " | ".join(cells)))
return "\n".join(indent + r for r in rows)
def main():
platform = sys.argv[1]
data = json.load((HERE / "data" / ("perf_usecases_%s.json" % platform)).open())
data = normalize_usecases(data) # the same choices as the figure
out = []
for uc, label in USE_CASES:
if uc not in data:
continue
out.append("**%s**\n" % label)
out.append(table(data, uc, ""))
out.append("")
print("\n".join(out))
if __name__ == "__main__":
main()