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
- zpl.tools engine
- BinaryKits.Zpl
Values behind this chart
| Engine | 1 p | 2 p | 3 p | 4 p | 5 p | 10 p | 15 p | 20 p | 25 p | 30 p | 35 p | 40 p | 45 p | 50 p | 75 p | 100 p | 150 p | 200 p | 300 p | 500 p |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| zpl.tools engine | 9 ms | 4 ms | 10 ms | 15 ms | 17 ms | 27 ms | 25 ms | 39 ms | 42 ms | 42 ms | 51 ms | 57 ms | 58 ms | 50 ms | 83 ms | 73 ms | 136 ms | 166 ms | 212 ms | 363 ms |
| BinaryKits.Zpl | 121 ms | 203 ms | 332 ms | 461 ms | 590 ms | 1,115 ms | 1,579 ms | 2,063 ms | 2,757 ms | 3,296 ms | 3,760 ms | 4,473 ms | 4,735 ms | 5,813 ms | 8,156 ms | 10,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
- zpl.tools engine
- BinaryKits.Zpl
Values behind this chart
| Engine | 1 p | 2 p | 3 p | 4 p | 5 p | 10 p | 15 p | 20 p | 25 p | 30 p | 35 p | 40 p | 45 p | 50 p | 75 p | 100 p | 150 p | 200 p | 300 p | 500 p |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| zpl.tools engine | 13.9 KB | 15.8 KB | 17.9 KB | 20.7 KB | 23.3 KB | 41.6 KB | 51.5 KB | 62.5 KB | 71.7 KB | 80.9 KB | 90.6 KB | 99.4 KB | 108.2 KB | 117.4 KB | 160.0 KB | 200.4 KB | 286.9 KB | 357.3 KB | 500.9 KB | 787.2 KB |
| BinaryKits.Zpl | 283.3 KB | 560.5 KB | 839.6 KB | 1.10 MB | 1.38 MB | 2.77 MB | 4.16 MB | 5.57 MB | 6.98 MB | 8.40 MB | 9.86 MB | 11.26 MB | 12.65 MB | 14.03 MB | 21.09 MB | 28.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.
| Pages | zpl.tools engine p50 | zpl.tools engine p90 | zpl.tools engine p95 | BinaryKits.Zpl p50 | BinaryKits.Zpl p90 | BinaryKits.Zpl p95 |
|---|---|---|---|---|---|---|
| 1 | 6 ms | 6 ms | 7 ms | 109 ms | 166 ms | 319 ms |
| 10 | 20 ms | 21 ms | 21 ms | 697 ms | 815 ms | 835 ms |
| 50 | 24 ms | 24 ms | 25 ms | 3,867 ms | 4,000 ms | 4,020 ms |
| 100 | 73 ms | 74 ms | 75 ms | 7,238 ms | 8,073 ms | 8,183 ms |
| 500 | 209 ms | 211 ms | 212 ms | — | — | — |
GS1 graphics label
A real retailer label with embedded ~DG graphics, duplicated per page. Every page carries the same label.
| Pages | zpl.tools engine p50 | zpl.tools engine p90 | zpl.tools engine p95 | BinaryKits.Zpl p50 | BinaryKits.Zpl p90 | BinaryKits.Zpl p95 |
|---|---|---|---|---|---|---|
| 1 | 11 ms | 12 ms | 12 ms | 110 ms | 137 ms | 158 ms |
| 10 | 18 ms | 19 ms | 19 ms | 943 ms | 1,058 ms | 1,074 ms |
| 50 | 35 ms | 37 ms | 37 ms | 5,146 ms | 5,594 ms | 5,705 ms |
| 100 | 62 ms | 72 ms | 73 ms | 15,010 ms | 16,139 ms | 16,167 ms |
| 500 | 178 ms | 182 ms | 184 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.
| Pages | zpl.tools engine p50 | zpl.tools engine p90 | zpl.tools engine p95 | BinaryKits.Zpl p50 | BinaryKits.Zpl p90 | BinaryKits.Zpl p95 |
|---|---|---|---|---|---|---|
| 1 | 9 ms | 12 ms | 12 ms | 121 ms | 192 ms | 434 ms |
| 10 | 27 ms | 33 ms | 33 ms | 1,115 ms | 1,200 ms | 1,206 ms |
| 50 | 50 ms | 52 ms | 52 ms | 5,813 ms | 6,113 ms | 6,145 ms |
| 100 | 73 ms | 75 ms | 78 ms | 10,949 ms | 11,325 ms | 11,546 ms |
| 500 | 363 ms | 367 ms | 368 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.
| Pages | zpl.tools engine p50 | zpl.tools engine p90 | zpl.tools engine p95 | BinaryKits.Zpl p50 | BinaryKits.Zpl p90 | BinaryKits.Zpl p95 |
|---|---|---|---|---|---|---|
| 1 | 9 ms | 12 ms | 12 ms | 186 ms | 323 ms | 654 ms |
| 10 | 31 ms | 34 ms | 34 ms | 1,389 ms | 1,418 ms | 1,431 ms |
| 50 | 114 ms | 115 ms | 116 ms | 7,499 ms | 8,342 ms | 8,460 ms |
| 100 | 203 ms | 206 ms | 206 ms | 15,493 ms | 16,504 ms | 16,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.mjsThe first command measures, the second writes website/lib/performance-data.json, and the third writes this page from it.