Skip to content

Commit

Permalink
Reduce allocations in TextDocumentStates.SelectAs* methods (#72159)
Browse files Browse the repository at this point in the history
These methods were using an unsized ArrayBuilder to create an ImmutableArray.

Instead, as the size is pre-known in all these methods, we can just use ImmutableArray.CreateBuilder directly.
  • Loading branch information
ToddGrun authored Feb 19, 2024
1 parent aa51391 commit 086e84a
Showing 1 changed file with 9 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -101,38 +101,41 @@ public IEnumerable<TState> GetStatesInCompilationOrder()

public ImmutableArray<TValue> SelectAsArray<TValue>(Func<TState, TValue> selector)
{
using var _ = ArrayBuilder<TValue>.GetInstance(out var builder);
// Directly use ImmutableArray.Builder as we know the final size
var builder = ImmutableArray.CreateBuilder<TValue>(_map.Count);

foreach (var (_, state) in _map)
{
builder.Add(selector(state));
}

return builder.ToImmutable();
return builder.MoveToImmutable();
}

public ImmutableArray<TValue> SelectAsArray<TValue, TArg>(Func<TState, TArg, TValue> selector, TArg arg)
{
using var _ = ArrayBuilder<TValue>.GetInstance(out var builder);
// Directly use ImmutableArray.Builder as we know the final size
var builder = ImmutableArray.CreateBuilder<TValue>(_map.Count);

foreach (var (_, state) in _map)
{
builder.Add(selector(state, arg));
}

return builder.ToImmutable();
return builder.MoveToImmutable();
}

public async ValueTask<ImmutableArray<TValue>> SelectAsArrayAsync<TValue, TArg>(Func<TState, TArg, CancellationToken, ValueTask<TValue>> selector, TArg arg, CancellationToken cancellationToken)
{
using var _ = ArrayBuilder<TValue>.GetInstance(out var builder);
// Directly use ImmutableArray.Builder as we know the final size
var builder = ImmutableArray.CreateBuilder<TValue>(_map.Count);

foreach (var (_, state) in _map)
{
builder.Add(await selector(state, arg, cancellationToken).ConfigureAwait(true));
}

return builder.ToImmutable();
return builder.MoveToImmutable();
}

public TextDocumentStates<TState> AddRange(ImmutableArray<TState> states)
Expand Down

0 comments on commit 086e84a

Please sign in to comment.