zpl.tools
Performance

zpl.tools and BinaryKits.Zpl

Response time, accepted page counts and response size, measured 2026-08-17

BinaryKits.Zpl is a local engine: .NET library in its docker web API. This page compares it with zpl.tools engine — the same renderer as the API, on localhost. Neither side crosses a network. A local engine is never compared with the hosted zpl.tools API, because the API adds network time that a local call does not carry.

Response time

Median response time, orderful style
  • zpl.tools engine
  • BinaryKits.Zpl
05,00010,0000100200300400500Pages per requestMedian response, ms10,949 ms363 ms
Orderful style, PDF.
Values behind this chart
Engine1 p2 p3 p4 p5 p10 p15 p20 p25 p30 p35 p40 p45 p50 p75 p100 p150 p200 p300 p500 p
zpl.tools engine9 ms4 ms10 ms15 ms17 ms27 ms25 ms39 ms42 ms42 ms51 ms57 ms58 ms50 ms83 ms73 ms136 ms166 ms212 ms363 ms
BinaryKits.Zpl121 ms203 ms332 ms461 ms590 ms1,115 ms1,579 ms2,063 ms2,757 ms3,296 ms3,760 ms4,473 ms4,735 ms5,813 ms8,156 ms10,949 ms

On one page, zpl.tools engine answers in a median 9 ms and BinaryKits.Zpl in 121 ms, a factor of 13.4. At 100 pages, the largest packet the benchmark sent to both engines, the medians are 73 ms and 10,949 ms. zpl.tools engine rendered 500 pages in a median 363 ms, and 500 pages is where the benchmark stopped — the renderer sets no page limit. The benchmark measured BinaryKits.Zpl to 100 pages.

Response size

PDF response size, orderful style
  • zpl.tools engine
  • BinaryKits.Zpl
0 B9.54 MB19.07 MB28.61 MB0100200300400500Pages per requestResponse body28.06 MB787.2 KB
Orderful style, PDF.
Values behind this chart
Engine1 p2 p3 p4 p5 p10 p15 p20 p25 p30 p35 p40 p45 p50 p75 p100 p150 p200 p300 p500 p
zpl.tools engine13.9 KB15.8 KB17.9 KB20.7 KB23.3 KB41.6 KB51.5 KB62.5 KB71.7 KB80.9 KB90.6 KB99.4 KB108.2 KB117.4 KB160.0 KB200.4 KB286.9 KB357.3 KB500.9 KB787.2 KB
BinaryKits.Zpl283.3 KB560.5 KB839.6 KB1.10 MB1.38 MB2.77 MB4.16 MB5.57 MB6.98 MB8.40 MB9.86 MB11.26 MB12.65 MB14.03 MB21.09 MB28.06 MB

A one-page PDF from zpl.tools engine is 13.9 KB. At 500 pages the same response is 787.2 KB: 56.8 times the size for 500 times the pages. The PDF writer stores one copy of a repeated page and references it, so a packet grows by its per-page content, not by a whole page. At 100 pages, the response is 200.4 KB against 28.06 MB from BinaryKits.Zpl.

Corpora

Each corpus is one request body, repeated at every page count. A corpus reaches this page only where the run measured both engines on it.

Simple label

Labelary's own example label, duplicated per page. Every page carries the same label.

Pageszpl.tools engine p50zpl.tools engine p90zpl.tools engine p95BinaryKits.Zpl p50BinaryKits.Zpl p90BinaryKits.Zpl p95
16 ms6 ms7 ms109 ms166 ms319 ms
1020 ms21 ms21 ms697 ms815 ms835 ms
5024 ms24 ms25 ms3,867 ms4,000 ms4,020 ms
10073 ms74 ms75 ms7,238 ms8,073 ms8,183 ms
500209 ms211 ms212 ms

GS1 graphics label

A real retailer label with embedded ~DG graphics, duplicated per page. Every page carries the same label.

Pageszpl.tools engine p50zpl.tools engine p90zpl.tools engine p95BinaryKits.Zpl p50BinaryKits.Zpl p90BinaryKits.Zpl p95
111 ms12 ms12 ms110 ms137 ms158 ms
1018 ms19 ms19 ms943 ms1,058 ms1,074 ms
5035 ms37 ms37 ms5,146 ms5,594 ms5,705 ms
10062 ms72 ms73 ms15,010 ms16,139 ms16,167 ms
500178 ms182 ms184 ms

Orderful style

Orderful retail compliance labels, a different label on every page. Every page carries a different label, so no engine can reuse a page it already rendered.

Pageszpl.tools engine p50zpl.tools engine p90zpl.tools engine p95BinaryKits.Zpl p50BinaryKits.Zpl p90BinaryKits.Zpl p95
19 ms12 ms12 ms121 ms192 ms434 ms
1027 ms33 ms33 ms1,115 ms1,200 ms1,206 ms
5050 ms52 ms52 ms5,813 ms6,113 ms6,145 ms
10073 ms75 ms78 ms10,949 ms11,325 ms11,546 ms
500363 ms367 ms368 ms

SPS Style

The same retailer labels delivered as ~DG bitmap pages, the SPS Commerce way. Every page carries a different label, so no engine can reuse a page it already rendered.

Pageszpl.tools engine p50zpl.tools engine p90zpl.tools engine p95BinaryKits.Zpl p50BinaryKits.Zpl p90BinaryKits.Zpl p95
19 ms12 ms12 ms186 ms323 ms654 ms
1031 ms34 ms34 ms1,389 ms1,418 ms1,431 ms
50114 ms115 ms116 ms7,499 ms8,342 ms8,460 ms
100203 ms206 ms206 ms15,493 ms16,504 ms16,708 ms

Method

k6 drives every point, one request at a time, 10 iterations per point, 5 past 150 pages. A one-page point carries 10 samples.

Client: k6, one request at a time. Both hosted engines measured in the same session from a Hetzner ccx13 (dedicated vCPU) in the fsn1 datacenter, Germany — network RTT included, the same for both sides. Local engines measured on a MacBook Pro (Apple Silicon), no network crossed; the zpl.tools, zebrash, BinaryKits and Neodynamic summaries carry over from the 2026-08-09 run, because no code in the render path changed between them. labelize was added on 2026-08-17 and measured on the same MacBook, at one page only — see below.

Measured 2026-08-17. The harness is benchmarks/run.sh, and its header names the local servers each engine needs. To repeat the run:

./benchmarks/run.sh
node scripts/distill-benchmarks.mjs
node scripts/generate-performance-pages.mjs

The first command measures, the second writes website/lib/performance-data.json, and the third writes this page from it.