From ab2035a7d7e24f8417890553ccef6e6b0f9649de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?TATSUNO=20=E2=80=9CTaz=E2=80=9D=20Yasuhiro?= Date: Tue, 6 Oct 2026 13:57:33 +0900 Subject: [PATCH] perf(layout): avoid quadratic shift() in resolveBookmarks --- .changeset/linear-bookmark-traversal.md | 5 +++++ packages/layout/src/steps/resolveBookmarks.ts | 8 +++----- 2 files changed, 8 insertions(+), 5 deletions(-) create mode 100644 .changeset/linear-bookmark-traversal.md diff --git a/.changeset/linear-bookmark-traversal.md b/.changeset/linear-bookmark-traversal.md new file mode 100644 index 000000000..74109fa08 --- /dev/null +++ b/.changeset/linear-bookmark-traversal.md @@ -0,0 +1,5 @@ +--- +'@react-pdf/layout': patch +--- + +perf: traverse the tree by index in resolveBookmarks instead of shift(), which was quadratic on documents with many elements diff --git a/packages/layout/src/steps/resolveBookmarks.ts b/packages/layout/src/steps/resolveBookmarks.ts index 4a7db7fed..0e463bc74 100644 --- a/packages/layout/src/steps/resolveBookmarks.ts +++ b/packages/layout/src/steps/resolveBookmarks.ts @@ -35,11 +35,9 @@ const resolveBookmarks = (node: DocumentNode) => { parent: null, })); - while (listToExplore.length > 0) { - const element = listToExplore.shift(); - - if (!element) break; - + // Index instead of shift() to keep the traversal linear on large trees + for (let i = 0; i < listToExplore.length; i += 1) { + const element = listToExplore[i]; const child = element.value; let parent = element.parent;