zpl.tools
Performance

zpl.tools and labelize

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

labelize is a local engine: Rust engine behind its own labelize serve HTTP surface. 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.

labelize renders one label per request. It parses the whole request, renders the first label and discards the rest — the response is byte-identical whether the request holds 1 page or 100 — and its library has no multi-page PDF at all, so its CLI writes one file per label. This page therefore compares it at a single label, the unit it actually works in, and reports no page-count series for it. It also rejects one of the four benchmark labels outright, with 400 No labels found.

Response time

Median response time, orderful style
  • zpl.tools engine
  • labelize
01002003004000100200300400500Pages per requestMedian response, ms363 ms10 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
labelize10 ms

On one page, zpl.tools engine answers in a median 9 ms and labelize in 10 ms, a factor of 1.1. 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. labelize renders one label per request, so 1 page is the whole of what it can be measured on.

Response size

PDF response size, orderful style
  • zpl.tools engine
  • labelize
0 B244.1 KB488.3 KB732.4 KB0100200300400500Pages per requestResponse body787.2 KB10.6 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
labelize10.6 KB

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.

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 p95labelize p50labelize p90labelize p95
16 ms6 ms7 ms14 ms19 ms21 ms
1020 ms21 ms21 ms
5024 ms24 ms25 ms
10073 ms74 ms75 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 p95labelize p50labelize p90labelize p95
111 ms12 ms12 msrejectedrejectedrejected
1018 ms19 ms19 ms
5035 ms37 ms37 ms
10062 ms72 ms73 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 p95labelize p50labelize p90labelize p95
19 ms12 ms12 ms10 ms11 ms13 ms
1027 ms33 ms33 ms
5050 ms52 ms52 ms
10073 ms75 ms78 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 p95labelize p50labelize p90labelize p95
19 ms12 ms12 ms8 ms8 ms9 ms
1031 ms34 ms34 ms
50114 ms115 ms116 ms
100203 ms206 ms206 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.