Skip to content

perf: store current_sources as Set for O(1) membership checks#18278

Merged
Rich-Harris merged 3 commits into
sveltejs:mainfrom
MathiasWP:perf/current-sources-as-set
May 28, 2026
Merged

perf: store current_sources as Set for O(1) membership checks#18278
Rich-Harris merged 3 commits into
sveltejs:mainfrom
MathiasWP:perf/current-sources-as-set

Conversation

@MathiasWP

@MathiasWP MathiasWP commented May 23, 2026

Copy link
Copy Markdown
Contributor

current_sources tracks the sources created within the active reaction so that reading or writing them during that same reaction doesn't trigger a re-run. It was an Array checked with Array.prototype.includes.call(...) in three hot places: the state_unsafe_mutation guard, set()'s destruction check, and schedule_possible_effect_self_invalidation.

The per-reaction collection of "sources created within this reaction" is
checked on every signal write inside a reaction (set, dev-mode
state_unsafe_mutation guard) and on every self-invalidation scheduling
pass. With Array.includes the check was O(n); switching to a Set makes
it O(1) and also drops the bound-call indirection of `includes.call`.

No semantic change: the collection is still per-reaction, still saved
and restored across nested reactions, still seeded by push_reaction_value.
@changeset-bot

changeset-bot Bot commented May 23, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: fac47d0

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
svelte Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@Rich-Harris Rich-Harris left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thank you!

@Rich-Harris Rich-Harris merged commit 67090e8 into sveltejs:main May 28, 2026
16 of 17 checks passed
@github-actions github-actions Bot mentioned this pull request May 28, 2026
Rich-Harris pushed a commit that referenced this pull request May 29, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) GitHub action. When
you're ready to do a release, you can merge this and the packages will
be published to npm automatically. If you're not ready to do a release
yet, that's fine, whenever you add more changesets to main, this PR will
be updated.


# Releases
## svelte@5.56.0

### Minor Changes

- feat: allow declarations in the template
([#18282](#18282))

### Patch Changes

- perf: use `createElement` instead of `createElementNS` for HTML
elements ([#18262](#18262))

- perf: store `current_sources` as a `Set` for O(1) membership checks
([#18278](#18278))

- perf: deduplicate identical hoisted templates within a component
([#18320](#18320))

- perf: hoist `rest_props` exclude list as a module-scope `Set`
([#18252](#18252))

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
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.

2 participants