Conversion Lab

Measured, not promised.

These are timing and output-size measurements for the exact converter code FileMorf ships to your browser, run against a fully synthetic, seeded PDF corpus. Raw results and the corpus manifest are downloadable below.

Last measured July 28, 2026 · build 4ef6888

What this is

FileMorf's PDF tools — merge, split, extract, page numbers, watermark — run locally in your browser using the open-source pdf-lib engine, and batch downloads are packaged with JSZip. The Lab benchmarks call those exact shipped functions (not a reimplementation) so the numbers describe the real code paths, and the corpus is generated from a fixed seed so anyone can reproduce the input files byte-for-byte.

Merging

BenchmarkInputMedianp95Output
Merge 2 PDFs
mergePdfs() over 2 three-page documents.
2 PDFs × 3 pages2.4ms5.7ms9.95 KB
Merge 10 PDFs
mergePdfs() over 10 three-page documents.
10 PDFs × 3 pages6.3ms9.1ms45.94 KB
Merge 50 PDFs
mergePdfs() over 50 three-page documents.
50 PDFs × 3 pages30.4ms32.7ms226.95 KB

Splitting & extraction

BenchmarkInputMedianp95Output
Split a 20-page PDF into single pages
splitPdf() with no range — one output document per page.
1 PDF × 20 pages5.9ms8.1ms45.16 KB · 20 files
Extract pages 1–5 from a 100-page PDF
extractPages() with the range "1-5".
1 PDF × 100 pages7ms7.3ms8.65 KB

Page tools

BenchmarkInputMedianp95Output
Number every page of a 100-page PDF
addPageNumbers() with the "page n of total" format.
1 PDF × 100 pages32.3ms36.9ms177.4 KB
Watermark every page of a 100-page PDF
watermarkPdf() drawing diagonal "DRAFT" text on each page.
1 PDF × 100 pages29.9ms31.5ms183.16 KB

Packaging

BenchmarkInputMedianp95Output
Package 50 PDFs into a ZIP
JSZip generateAsync with the same defaults the site's batch download uses.
50 PDFs × 3 pages5.5ms10.1ms277.63 KB

Methodology

  • Each benchmark runs 1 warm-up pass, then 7 timed runs; we report the median and 95th percentile.
  • The code under test is src/lib/converters/pdf.ts — the same module browsers download — with pdf-lib 1.17.1 and JSZip 3.10.1, the exact versions pinned in the shipping build.
  • The corpus is fully synthetic (seeded pseudo-random text; no customer or third-party files) and each file's SHA-256 is published in the corpus manifest.
  • Reference environment: Node.js v23.7.0 on Apple M2 Pro (arm64, 10 cores).

Limitations — read this before comparing

  • Timings come from a server-class JavaScript runtime on reference hardware. Your browser runs the same code, but phone and older-laptop timings will be slower; the numbers are best used to compare operations against each other and releases against each other.
  • The corpus is text-only PDF. Scanned, image-heavy, encrypted, or malformed documents behave differently — expanding the corpus is planned work, and the schema is versioned so old results stay comparable.
  • Browser-only operations (Canvas image conversion, PDF rendering to images, ffmpeg media work) are not yet in the Lab because they cannot run unmodified outside a browser.

Data downloads

  • results.json — raw benchmark output (schema filemorf-lab-results/1), CC BY 4.0.
  • corpus-manifest.json — every corpus file's page count, byte size, seed, and SHA-256.

Questions about the methodology, or a benchmark you want added? support@filemorf.com. Read more about how FileMorf is tested on the about page.