Skip to content

perf: inline dedup loop in getParentNodes#572

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

perf: inline dedup loop in getParentNodes#572
jvoisin wants to merge 1 commit into
PuerkitoBio:masterfrom
jvoisin:inlines

Conversation

@jvoisin

@jvoisin jvoisin commented May 31, 2026

Copy link
Copy Markdown
Contributor

getParentNodes routed Parent/ParentFiltered through mapNodes with a closure returning a one-element []*html.Node{n.Parent} per source node. On a sibling selection nearly all of those slices point at the same parent and are immediately deduped away.

This commit walks s.Nodes directly instead: for a single node, return its parent with no map; for many, dedup parents into a shared set while appending. This removes the per-node slice allocation at the source rather than cleaning it up downstream.

benchstat (count=10, all p=0.000):

allocs/op Parent 384->7 (-98%), ParentFiltered 392->16 (-96%)
sec/op Parent -78%, ParentFiltered -59%
B/op both -22%

getParentNodes routed Parent/ParentFiltered through mapNodes with a
closure returning a one-element []*html.Node{n.Parent} per source node.
On a sibling selection nearly all of those slices point at the same
parent and are immediately deduped away.

This commit walks s.Nodes directly instead: for a single node, return its
parent with no map; for many, dedup parents into a shared set while appending.
This removes the per-node slice allocation at the source rather than cleaning
it up downstream.

benchstat (count=10, all p=0.000):

  allocs/op    Parent 384->7 (-98%), ParentFiltered 392->16 (-96%)
  sec/op       Parent -78%, ParentFiltered -59%
  B/op         both -22%
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