Skip to content

Optimize comparison methods in immutable collections #127279

@aw0lid

Description

@aw0lid

Description

While working on PR #126309 for Issue #90986, I noticed that the current implementation of several comparison methods in the System.Collections.Immutable library always creates a new intermediate collection (like HashSet<T> or SortedSet<T>).

The Problem

This intermediate allocation is often unnecessary. For example, if both collections are of the same type (e.g., both are ImmutableSortedSet<T>) and share the same comparer, we can perform the comparison directly without allocating any new memory on the heap.

The Solution

I propose adding a "Fast Path" to detect these cases and perform the check directly. This will:

  • Eliminate unnecessary allocations when types/comparers are compatible.
  • Improve performance by moving from building a fully new collection to a direct linear comparison of existing elements wherever applicable.

Targeted Methods & Progress

I am taking ownership of this optimization and will be submitting focused PRs for each:

Next Steps: I plan to apply the same pattern to:

  • ImmutableHashSet<T>: IsSubsetOf.
  • ImmutableSortedSet<T>: IsSubsetOf, IsProperSubsetOf.
  • Any other applicable locations within the immutable collections where this "Fast Path" pattern can be leveraged to avoid redundant allocations.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions