-
Notifications
You must be signed in to change notification settings - Fork 4.9k
Use Array.Empty<T> for LINQ's Enumerable.Empty<TResult> #2290
Conversation
@@ -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. |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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).
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
cc: @VSadov |
LGTM |
Use Array.Empty<T> for LINQ's Enumerable.Empty<TResult>
Use Array.Empty<T> for LINQ's Enumerable.Empty<TResult> Commit migrated from dotnet/corefx@b219b8d
No description provided.