Performance
How zpl.tools compares with other ZPL engines, measured 2026-08-17
These pages report one benchmark run against 5 other ZPL engines. Each page reports response time against page count, the page counts the engine accepted, and the size of the response body.
The pairing rule
A hosted service is compared with the hosted zpl.tools API. A local library is compared with the zpl.tools engine on localhost. The two kinds are never mixed: a hosted API carries network time that a local call does not, and a comparison across that boundary reports the network, not the engine.
The pages
| Platform | Kind | Compared with | Largest packet it rendered |
|---|---|---|---|
| Labelary | hosted | zpl.tools | 50 pages (rejects larger) |
| zebrash | local | zpl.tools engine | 100 pages (benchmark ceiling) |
| BinaryKits.Zpl | local | zpl.tools engine | 100 pages (benchmark ceiling) |
| Neodynamic ZPLPrinter | local | zpl.tools engine | 100 pages (benchmark ceiling) |
| labelize | local | zpl.tools engine | 1 page (renders one label per request) |
Every figure comes from website/lib/performance-data.json, which node scripts/distill-benchmarks.mjs writes from the k6 summaries. Measured 2026-08-17. The hosted zpl.tools API rendered 500 pages in one request in this run, and that is the largest request the benchmark sent — the API sets no page limit.
Corpora
| Corpus | What it is |
|---|---|
| Simple label | Labelary's own example label, duplicated per page |
| GS1 graphics label | A real retailer label with embedded ~DG graphics, duplicated per page |
| Orderful style | Orderful retail compliance labels, a different label on every page |
| SPS Style | The same retailer labels delivered as ~DG bitmap pages, the SPS Commerce way |
Method
k6 drives every point, one request at a time, 10 iterations per point, 5 past 150 pages.
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.
The harness is benchmarks/run.sh. Its header names the local servers each engine needs.