Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use Array.Empty<T> for LINQ's Enumerable.Empty<TResult> #2290

Merged
merged 1 commit into from Jul 9, 2015

Conversation

justinvp
Copy link
Contributor

@justinvp justinvp commented Jul 9, 2015

No description provided.

@@ -1452,7 +1452,10 @@ private static IEnumerable<TResult> RepeatIterator<TResult>(TResult element, int

public static IEnumerable<TResult> Empty<TResult>()
{
return EmptyEnumerable<TResult>.Instance;
// This is a more memory-intensive empty enumerable that allocates a new enumerator each time.
Copy link
Member

@stephentoub stephentoub Jul 9, 2015

Choose a reason for hiding this comment

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

I don't believe this comment is accurate any more. Enumerating an empty array should not allocate a new enumerator: https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/Array.cs#L2717

Copy link
Contributor Author

@justinvp justinvp Jul 9, 2015

Choose a reason for hiding this comment

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

Excellent! I'll remove the comment.

Copy link
Contributor Author

@justinvp justinvp Jul 9, 2015

Choose a reason for hiding this comment

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

As an aside, correct me if I am wrong, but it looks like SZGenericArrayEnumerator<T>.Empty is being greedily allocated as soon as SZGenericArrayEnumerator<T> is used for the first time (first time the generic GetEnumerator is called). Which means lots of possible unnecessary empty enumerator allocations for each T. Wouldn't it be better if this was lazily allocated only when an empty enumerator was actually needed? Something like EmptySZGenericArrayEnumerator<T>.Instance. (I can open an issue/PR on CoreCLR to continue the discussion there, if warranted).

Copy link
Member

@stephentoub stephentoub Jul 9, 2015

Choose a reason for hiding this comment

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

Yeah, that's probably a good idea.

Copy link
Contributor Author

@justinvp justinvp Jul 9, 2015

Choose a reason for hiding this comment

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

Never mind -- I tested it out and the runtime is doing the right thing.

@stephentoub
Copy link
Member

stephentoub commented Jul 9, 2015

cc: @VSadov

@VSadov
Copy link
Member

VSadov commented Jul 9, 2015

LGTM

stephentoub added a commit that referenced this pull request Jul 9, 2015
Use Array.Empty<T> for LINQ's Enumerable.Empty<TResult>
@stephentoub stephentoub merged commit b219b8d into dotnet:master Jul 9, 2015
@justinvp justinvp deleted the linqempty branch Oct 1, 2015
@karelz karelz modified the milestone: 1.0.0-rtm Dec 3, 2016
picenka21 pushed a commit to picenka21/runtime that referenced this pull request Feb 18, 2022
Use Array.Empty<T> for LINQ's Enumerable.Empty<TResult>

Commit migrated from dotnet/corefx@b219b8d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
5 participants