{
  "schema": "filemorf-lab-results/1",
  "generatedAt": "2026-07-28T00:50:15.853Z",
  "commit": "4ef6888",
  "environment": {
    "runtime": "Node.js v23.7.0",
    "cpu": "Apple M2 Pro",
    "cpuCores": 10,
    "arch": "arm64",
    "platform": "darwin",
    "libraries": {
      "pdf-lib": "1.17.1",
      "jszip": "3.10.1"
    }
  },
  "methodology": {
    "warmupRuns": 1,
    "timedRuns": 7,
    "timer": "perf_hooks performance.now()",
    "corpus": "Seeded synthetic PDFs — see corpus-manifest.json",
    "code": "The exact converter functions shipped to browsers (src/lib/converters/pdf.ts) plus JSZip packaging as used by the batch download."
  },
  "benchmarks": [
    {
      "id": "merge-2",
      "group": "Merging",
      "label": "Merge 2 PDFs",
      "description": "mergePdfs() over 2 three-page documents.",
      "inputSummary": "2 PDFs × 3 pages",
      "iterations": 7,
      "medianMs": 2.4,
      "p95Ms": 5.7,
      "minMs": 1.3,
      "outputBytes": 10185,
      "outputFiles": 1
    },
    {
      "id": "merge-10",
      "group": "Merging",
      "label": "Merge 10 PDFs",
      "description": "mergePdfs() over 10 three-page documents.",
      "inputSummary": "10 PDFs × 3 pages",
      "iterations": 7,
      "medianMs": 6.3,
      "p95Ms": 9.1,
      "minMs": 5.1,
      "outputBytes": 47046,
      "outputFiles": 1
    },
    {
      "id": "merge-50",
      "group": "Merging",
      "label": "Merge 50 PDFs",
      "description": "mergePdfs() over 50 three-page documents.",
      "inputSummary": "50 PDFs × 3 pages",
      "iterations": 7,
      "medianMs": 30.4,
      "p95Ms": 32.7,
      "minMs": 28.6,
      "outputBytes": 232398,
      "outputFiles": 1
    },
    {
      "id": "split-20",
      "group": "Splitting & extraction",
      "label": "Split a 20-page PDF into single pages",
      "description": "splitPdf() with no range — one output document per page.",
      "inputSummary": "1 PDF × 20 pages",
      "iterations": 7,
      "medianMs": 5.9,
      "p95Ms": 8.1,
      "minMs": 4.4,
      "outputBytes": 46239,
      "outputFiles": 20
    },
    {
      "id": "extract-5-of-100",
      "group": "Splitting & extraction",
      "label": "Extract pages 1–5 from a 100-page PDF",
      "description": "extractPages() with the range \"1-5\".",
      "inputSummary": "1 PDF × 100 pages",
      "iterations": 7,
      "medianMs": 7,
      "p95Ms": 7.3,
      "minMs": 6.6,
      "outputBytes": 8855,
      "outputFiles": 1
    },
    {
      "id": "page-numbers-100",
      "group": "Page tools",
      "label": "Number every page of a 100-page PDF",
      "description": "addPageNumbers() with the \"page n of total\" format.",
      "inputSummary": "1 PDF × 100 pages",
      "iterations": 7,
      "medianMs": 32.3,
      "p95Ms": 36.9,
      "minMs": 30.2,
      "outputBytes": 181656,
      "outputFiles": 1
    },
    {
      "id": "watermark-100",
      "group": "Page tools",
      "label": "Watermark every page of a 100-page PDF",
      "description": "watermarkPdf() drawing diagonal \"DRAFT\" text on each page.",
      "inputSummary": "1 PDF × 100 pages",
      "iterations": 7,
      "medianMs": 29.9,
      "p95Ms": 31.5,
      "minMs": 27.2,
      "outputBytes": 187556,
      "outputFiles": 1
    },
    {
      "id": "zip-50",
      "group": "Packaging",
      "label": "Package 50 PDFs into a ZIP",
      "description": "JSZip generateAsync with the same defaults the site's batch download uses.",
      "inputSummary": "50 PDFs × 3 pages",
      "iterations": 7,
      "medianMs": 5.5,
      "p95Ms": 10.1,
      "minMs": 5.2,
      "outputBytes": 284298,
      "outputFiles": 1
    }
  ]
}
