Skip to content

perf: presize result slice in getChildrenWithSiblingType#571

Open
jvoisin wants to merge 1 commit into
PuerkitoBio:masterfrom
jvoisin:prre
Open

perf: presize result slice in getChildrenWithSiblingType#571
jvoisin wants to merge 1 commit into
PuerkitoBio:masterfrom
jvoisin:prre

Conversation

@jvoisin

@jvoisin jvoisin commented May 31, 2026

Copy link
Copy Markdown
Contributor

The collect-all sibling traversals (Siblings, NextAll, PrevAll, Contents and their filtered variants) grew the result slice via append with no capacity hint, paying repeated grow-and-double reallocations.

This commit runs the existing iterator once to count the matching siblings, then presize the result slice before collecting. The Until cases are left alone, as their predicate would run twice, and the single-result Next/Prev cases need no allocation.

benchstat (count=10):

allocs/op Siblings -57%, SiblingsFiltered -54%, NextAll -60%,
NextAllFiltered -56%, PrevAll -55%, PrevAllFiltered -53%,
Contents -10%, ChildrenFiltered -17% (geomean -35%)
B/op geomean -6% (-9% to -11% on the All paths)
sec/op PrevAll -44%, Next -29%, Contents -27% (geomean -20%)

The collect-all sibling traversals (Siblings, NextAll, PrevAll, Contents
and their filtered variants) grew the result slice via append with no
capacity hint, paying repeated grow-and-double reallocations.

This commit runs the existing iterator once to count the matching siblings,
then presize the result slice before collecting. The Until cases are left
alone, as their predicate would run twice, and the single-result Next/Prev
cases need no allocation.

benchstat (count=10):

  allocs/op    Siblings -57%, SiblingsFiltered -54%, NextAll -60%,
               NextAllFiltered -56%, PrevAll -55%, PrevAllFiltered -53%,
               Contents -10%, ChildrenFiltered -17% (geomean -35%)
  B/op         geomean -6% (-9% to -11% on the All paths)
  sec/op       PrevAll -44%, Next -29%, Contents -27% (geomean -20%)
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