zpl.tools and Neodynamic ZPLPrinter
Response time, accepted page counts and response size, measured 2026-08-17
Neodynamic ZPLPrinter is a local engine: commercial .NET engine 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
- Neodynamic ZPLPrinter
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 |
| Neodynamic ZPLPrinter | 38 ms | 65 ms | 86 ms | 105 ms | 121 ms | 214 ms | 299 ms | 386 ms | 476 ms | 562 ms | 660 ms | 748 ms | 838 ms | 911 ms | 1,359 ms | 1,808 ms | — | — | — | — |
On one page, zpl.tools engine answers in a median 9 ms and Neodynamic ZPLPrinter in 38 ms, a factor of 4.2. At 100 pages, the largest packet the benchmark sent to both engines, the medians are 73 ms and 1,808 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 Neodynamic ZPLPrinter to 100 pages.
Response size
- zpl.tools engine
- Neodynamic ZPLPrinter
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 |
| Neodynamic ZPLPrinter | 443.9 KB | 874.3 KB | 1.32 MB | 1.76 MB | 2.20 MB | 4.57 MB | 6.93 MB | 9.21 MB | 11.40 MB | 13.70 MB | 16.07 MB | 18.25 MB | 20.63 MB | 22.74 MB | 34.33 MB | 45.82 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 45.82 MB from Neodynamic ZPLPrinter.
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 | Neodynamic ZPLPrinter p50 | Neodynamic ZPLPrinter p90 | Neodynamic ZPLPrinter p95 |
|---|---|---|---|---|---|---|
| 1 | 6 ms | 6 ms | 7 ms | 44 ms | 60 ms | 109 ms |
| 10 | 20 ms | 21 ms | 21 ms | 179 ms | 182 ms | 182 ms |
| 50 | 24 ms | 24 ms | 25 ms | 826 ms | 834 ms | 836 ms |
| 100 | 73 ms | 74 ms | 75 ms | 1,625 ms | 1,691 ms | 1,746 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 | Neodynamic ZPLPrinter p50 | Neodynamic ZPLPrinter p90 | Neodynamic ZPLPrinter p95 |
|---|---|---|---|---|---|---|
| 1 | 11 ms | 12 ms | 12 ms | 42 ms | 46 ms | 46 ms |
| 10 | 18 ms | 19 ms | 19 ms | 223 ms | 239 ms | 239 ms |
| 50 | 35 ms | 37 ms | 37 ms | 953 ms | 968 ms | 974 ms |
| 100 | 62 ms | 72 ms | 73 ms | 3,026 ms | 3,203 ms | 3,289 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 | Neodynamic ZPLPrinter p50 | Neodynamic ZPLPrinter p90 | Neodynamic ZPLPrinter p95 |
|---|---|---|---|---|---|---|
| 1 | 9 ms | 12 ms | 12 ms | 38 ms | 40 ms | 40 ms |
| 10 | 27 ms | 33 ms | 33 ms | 214 ms | 221 ms | 221 ms |
| 50 | 50 ms | 52 ms | 52 ms | 911 ms | 949 ms | 950 ms |
| 100 | 73 ms | 75 ms | 78 ms | 1,808 ms | 1,825 ms | 1,830 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 | Neodynamic ZPLPrinter p50 | Neodynamic ZPLPrinter p90 | Neodynamic ZPLPrinter p95 |
|---|---|---|---|---|---|---|
| 1 | 9 ms | 12 ms | 12 ms | 33 ms | 37 ms | 39 ms |
| 10 | 31 ms | 34 ms | 34 ms | 236 ms | 247 ms | 249 ms |
| 50 | 114 ms | 115 ms | 116 ms | 1,091 ms | 1,125 ms | 1,228 ms |
| 100 | 203 ms | 206 ms | 206 ms | 2,182 ms | 2,412 ms | 2,503 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.