Skip to content

perf(core): avoid per-ref string allocations via PdfRef.key#62

Open
ntedvs wants to merge 1 commit intoLibPDF-js:mainfrom
ntedvs:perf/pdf-ref-key
Open

perf(core): avoid per-ref string allocations via PdfRef.key#62
ntedvs wants to merge 1 commit intoLibPDF-js:mainfrom
ntedvs:perf/pdf-ref-key

Conversation

@ntedvs
Copy link
Copy Markdown
Contributor

@ntedvs ntedvs commented Apr 22, 2026

Ref identity Maps/Sets were keyed on template strings like "${objNum} ${gen}", allocating a string per visit. Introduce PdfRef.key, a packed numeric identity (objNum * 65536 + gen, lossless since PDF caps generation at 65535), and migrate the two hottest call sites: collectReachableRefs in the writer GC walk, and the parser's object cache plus page-tree visitor.

Measured on the same machine:

  • load heavy PDF (9.9MB): +13.5%
  • load small/medium/form PDF: +9 to 10%
  • save heavy PDF (9.9MB): +7%
  • save with modifications (19KB): +3%

Ref identity Maps/Sets were keyed on template strings like "${objNum} ${gen}", allocating a string per visit. Introduce PdfRef.key, a packed numeric identity (objNum * 65536 + gen, lossless since PDF caps generation at 65535), and migrate the two hottest call sites: collectReachableRefs in the writer GC walk, and the parser's object cache plus page-tree visitor.

Measured on the same machine:
- load heavy PDF (9.9MB): +13.5%
- load small/medium/form PDF: +9 to 10%
- save heavy PDF (9.9MB): +7%
- save with modifications (19KB): +3%
@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Apr 22, 2026

@ntedvs is attempting to deploy a commit to the mythie's projects Team on Vercel.

A member of the Team first needs to authorize it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant