zpl.tools
Performance

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

PlatformKindCompared withLargest packet it rendered
Labelaryhostedzpl.tools50 pages (rejects larger)
zebrashlocalzpl.tools engine100 pages (benchmark ceiling)
BinaryKits.Zpllocalzpl.tools engine100 pages (benchmark ceiling)
Neodynamic ZPLPrinterlocalzpl.tools engine100 pages (benchmark ceiling)
labelizelocalzpl.tools engine1 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

CorpusWhat it is
Simple labelLabelary's own example label, duplicated per page
GS1 graphics labelA real retailer label with embedded ~DG graphics, duplicated per page
Orderful styleOrderful retail compliance labels, a different label on every page
SPS StyleThe 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.