REFERENCE

Benchmark results

Explore recorded render times and browser bundle sizes. Real documents, visible methodology, and the raw data behind every chart.

JavaScript · 01 Nov 2026Apple M4 Pro30 renders / scenario

Render performance#

The measured build includes the auto-width and nested table header fixes. Identical document definitions and Inter font files, including receipts, large tables, positioned invoice overlays, and ERP registration forms. Choose a metric to inspect the recorded results.

MinkPDF JavaScriptpdfmake 0.3.13Lower render time is better

Warmed median

Median render time after three warmups. Lower is better.

SVG ↓
Warmed median (ms)Median render time after three warmups. Lower is better. All bars start at zero and use the same linear scale.050100150200short documentshort document · MinkPDF JavaScript: 0.238 ms0.238short document · pdfmake 0.3.13: 9.668 ms9.668100-row report100-row report · MinkPDF JavaScript: 2.291 ms2.291100-row report · pdfmake 0.3.13: 26.342 ms26.3421,000-row report1,000-row report · MinkPDF JavaScript: 19.871 ms19.8711,000-row report · pdfmake 0.3.13: 137.349 ms137.349nested vouchernested voucher · MinkPDF JavaScript: 0.461 ms0.461nested voucher · pdfmake 0.3.13: 12.993 ms12.993invoice overlayinvoice overlay · MinkPDF JavaScript: 0.279 ms0.279invoice overlay · pdfmake 0.3.13: 9.219 ms9.219ERP registration formERP registration form · MinkPDF JavaScript: 0.59 ms0.59ERP registration form · pdfmake 0.3.13: 12.612 ms12.612
Linear scale from zero · msMinkPDF JavaScriptpdfmake

95th percentile

The 95th percentile of 30 warmed renders. Lower is better.

SVG ↓
95th percentile (ms)The 95th percentile of 30 warmed renders. Lower is better. All bars start at zero and use the same linear scale.050100150200short documentshort document · MinkPDF JavaScript: 1.022 ms1.022short document · pdfmake 0.3.13: 12.03 ms12.03100-row report100-row report · MinkPDF JavaScript: 3.363 ms3.363100-row report · pdfmake 0.3.13: 28.478 ms28.4781,000-row report1,000-row report · MinkPDF JavaScript: 21.047 ms21.0471,000-row report · pdfmake 0.3.13: 141.254 ms141.254nested vouchernested voucher · MinkPDF JavaScript: 0.633 ms0.633nested voucher · pdfmake 0.3.13: 14.804 ms14.804invoice overlayinvoice overlay · MinkPDF JavaScript: 0.474 ms0.474invoice overlay · pdfmake 0.3.13: 11.151 ms11.151ERP registration formERP registration form · MinkPDF JavaScript: 0.892 ms0.892ERP registration form · pdfmake 0.3.13: 14.863 ms14.863
Linear scale from zero · msMinkPDF JavaScriptpdfmake

First render

First render, including font parsing. Lower is better.

SVG ↓
First render (ms)First render, including font parsing. Lower is better. All bars start at zero and use the same linear scale.050100150200short documentshort document · MinkPDF JavaScript: 9.616 ms9.616short document · pdfmake 0.3.13: 28.434 ms28.434100-row report100-row report · MinkPDF JavaScript: 14.955 ms14.955100-row report · pdfmake 0.3.13: 36.603 ms36.6031,000-row report1,000-row report · MinkPDF JavaScript: 24.825 ms24.8251,000-row report · pdfmake 0.3.13: 133.324 ms133.324nested vouchernested voucher · MinkPDF JavaScript: 4.997 ms4.997nested voucher · pdfmake 0.3.13: 16.55 ms16.55invoice overlayinvoice overlay · MinkPDF JavaScript: 3.634 ms3.634invoice overlay · pdfmake 0.3.13: 10.047 ms10.047ERP registration formERP registration form · MinkPDF JavaScript: 4.351 ms4.351ERP registration form · pdfmake 0.3.13: 14.032 ms14.032
Linear scale from zero · msMinkPDF JavaScriptpdfmake

PDF output size

Generated PDF bytes. Layout, compression, and page counts can differ.

SVG ↓
PDF output size (bytes)Generated PDF bytes. Layout, compression, and page counts can differ. All bars start at zero and use the same linear scale.050k100k150k200kshort documentshort document · MinkPDF JavaScript: 7,420 bytes7,420short document · pdfmake 0.3.13: 8,176 bytes8,176100-row report100-row report · MinkPDF JavaScript: 20,094 bytes20,094100-row report · pdfmake 0.3.13: 28,349 bytes28,3491,000-row report1,000-row report · MinkPDF JavaScript: 73,938 bytes73,9381,000-row report · pdfmake 0.3.13: 150,051 bytes150,051nested vouchernested voucher · MinkPDF JavaScript: 12,188 bytes12,188nested voucher · pdfmake 0.3.13: 13,718 bytes13,718invoice overlayinvoice overlay · MinkPDF JavaScript: 7,799 bytes7,799invoice overlay · pdfmake 0.3.13: 8,536 bytes8,536ERP registration formERP registration form · MinkPDF JavaScript: 12,969 bytes12,969ERP registration form · pdfmake 0.3.13: 14,717 bytes14,717
Linear scale from zero · bytesMinkPDF JavaScriptpdfmake

Every measurement#

All times are milliseconds. Each size is in bytes; page counts are included to make layout differences visible.

Recorded render measurements
Document / engineFirstMedianp95PDF bytesPages
short documentMinkPDF JavaScript9.6160.2381.0227,4201
short documentpdfmake 0.3.1328.4349.66812.038,1761
100-row reportMinkPDF JavaScript14.9552.2913.36320,0944
100-row reportpdfmake 0.3.1336.60326.34228.47828,3494
1,000-row reportMinkPDF JavaScript24.82519.87121.04773,93833
1,000-row reportpdfmake 0.3.13133.324137.349141.254150,05134
nested voucherMinkPDF JavaScript4.9970.4610.63312,1881
nested voucherpdfmake 0.3.1316.5512.99314.80413,7181
invoice overlayMinkPDF JavaScript3.6340.2790.4747,7991
invoice overlaypdfmake 0.3.1310.0479.21911.1518,5361
ERP registration formMinkPDF JavaScript4.3510.590.89212,9691
ERP registration formpdfmake 0.3.1314.03212.61214.86314,7171

Engine bundle comparison#

The report measures the historical root engine against pdfmake 0.3.13. MinkPDF includes its historical tables, images, and TrueType capabilities; other optional factories are excluded. MinkPDF bundles a default-API wrapper around src/index.js with Bun and smoke-tests the resulting bundle; pdfmake uses its distributed minified browser build. Both engine sizes exclude font assets. The separate consumer measurement below includes only the features selected by each import.

Minified engines

JavaScript default API bundle · Bun 1.4.2 · fonts excluded

SVG ↓
Minified engines (bytes)JavaScript default API bundle · Bun 1.4.2 · fonts excluded All bars start at zero and use the same linear scale.0225k450k675k900kMinkPDF JavaScriptMinkPDF JavaScript · MinkPDF JavaScript: 35,919 bytes35,919pdfmake 0.3.13pdfmake 0.3.13 · pdfmake 0.3.13: 832,484 bytes832,484
Linear scale from zero · bytes

Gzip engines

JavaScript default API bundle · Bun 1.4.2 · fonts excluded

SVG ↓
Gzip engines (bytes)JavaScript default API bundle · Bun 1.4.2 · fonts excluded All bars start at zero and use the same linear scale.075k150k225k300kMinkPDF JavaScriptMinkPDF JavaScript · MinkPDF JavaScript: 15,254 bytes15,254pdfmake 0.3.13pdfmake 0.3.13 · pdfmake 0.3.13: 296,651 bytes296,651
Linear scale from zero · bytes
EngineMinified bytesGzip bytesLocal import (ms)
MinkPDF JavaScript35,91915,2542.06
pdfmake 0.3.13832,484296,65134.597

Pay for the features you use#

The separate Bun 1.4.2 measurement bundles a browser consumer of each public entry point, minified, with content: 'Hello'. The root selects historical tables, images, and TrueType; the core omits those implementations. Enhanced factories select the report backend and can be larger than the root. Additional optional capabilities are not represented by this six-consumer measurement. Font assets are excluded.

Minified consumer bundles

Optional-feature measurement · Bun 1.4.2 · fonts excluded

SVG ↓
Minified consumer bundles (bytes)Optional-feature measurement · Bun 1.4.2 · fonts excluded All bars start at zero and use the same linear scale.017.5k35k52.5k70kCore onlyCore only · MinkPDF JavaScript: 22,158 bytes22,158Full · named importFull · named import · MinkPDF JavaScript: 35,642 bytes35,642Full · default importFull · default import · MinkPDF JavaScript: 35,934 bytes35,934Core + TrueTypeCore + TrueType · MinkPDF JavaScript: 61,077 bytes61,077Core + imagesCore + images · MinkPDF JavaScript: 63,618 bytes63,618Core + tablesCore + tables · MinkPDF JavaScript: 64,576 bytes64,576
Linear scale from zero · bytes

Gzip consumer bundles

Optional-feature measurement · Bun 1.4.2 · fonts excluded

SVG ↓
Gzip consumer bundles (bytes)Optional-feature measurement · Bun 1.4.2 · fonts excluded All bars start at zero and use the same linear scale.07.5k15k22.5k30kCore onlyCore only · MinkPDF JavaScript: 9,709 bytes9,709Full · named importFull · named import · MinkPDF JavaScript: 15,142 bytes15,142Full · default importFull · default import · MinkPDF JavaScript: 15,261 bytes15,261Core + TrueTypeCore + TrueType · MinkPDF JavaScript: 22,214 bytes22,214Core + imagesCore + images · MinkPDF JavaScript: 23,156 bytes23,156Core + tablesCore + tables · MinkPDF JavaScript: 23,733 bytes23,733
Linear scale from zero · bytes
ConsumerMinified bytesGzip bytes
namedRoot35,64215,142
defaultRoot35,93415,261
core22,1589,709
tables64,57623,733
images63,61823,156
truetype61,07722,214

How these were measured#

  • Render comparison: Bun 1.4.2, Apple M4 Pro, darwin 27.2.0, arm64; 3 warmups and 30 measured renders per scenario.
  • The displayed JavaScript and pdfmake results come from one sequential two-engine run, with MinkPDF first in each scenario.
  • Font I/O, module import, and definition cloning are outside render timings. First-render timings include font parsing. MinkPDF reuses parsed fonts across warmed renders; pdfmake creates a new font cache for each PDF.
  • Identical definitions and font files go to both engines. Poppler checks representative output text and page counts; this does not establish visual equivalence.
  • Import time measures local Bun module loading, not browser network delivery.
  • Optional-feature bundle results use Bun 1.4.2, browser target, and minification. Engine and consumer bundles use different entry points; compare each measurement within its own group.

Reproduce the results#

Clone the repository and install Bun and Poppler. Registry access is required: the render benchmark installs pdfmake 0.3.13 in a temporary directory and removes it afterward.

Terminal
bun run benchmark --runs=30 --output=/tmp/minkpdf-benchmark

# Current optional-feature bundle sizes (Bun 1.4.2)
bun run build
bun benchmarks/tree-shaking.js --output=/tmp/minkpdf-bundles.json

--output on the render benchmark saves measured PDFs and results.json. Use --font-dir=/path/to/fonts to supply other font fixtures. Inspect the benchmark source and document definitions.

Search pages, examples, and API methods.