diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs index 27b4a385bf03f5..982a4d45b44cf9 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/Activity.cs @@ -1755,6 +1755,19 @@ public TagsLinkedList(IEnumerator> e) } } + public TagsLinkedList(ReadOnlySpan> tags) + { + Debug.Assert(tags.Length > 0); + + _last = _first = new DiagNode>(tags[0]); + + for (int i = 1; i < tags.Length; i++) + { + _last.Next = new DiagNode>(tags[i]); + _last = _last.Next; + } + } + public DiagNode>? First => _first; public TagsLinkedList(IEnumerable> list) => Add(list); diff --git a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/ActivityEvent.cs b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/ActivityEvent.cs index 48d411c4508cb2..c383c4a7fc8902 100644 --- a/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/ActivityEvent.cs +++ b/src/libraries/System.Diagnostics.DiagnosticSource/src/System/Diagnostics/ActivityEvent.cs @@ -31,7 +31,19 @@ public ActivityEvent(string name) : this(name, DateTimeOffset.UtcNow, tags: null /// Event Tags. public ActivityEvent(string name, DateTimeOffset timestamp = default, ActivityTagsCollection? tags = null) : this(name, timestamp, tags, tags is null ? 0 : tags.Count) { } - internal ActivityEvent(string name, DateTimeOffset timestamp, ref TagList tags) : this(name, timestamp, tags, tags.Count) { } + internal ActivityEvent(string name, DateTimeOffset timestamp, ref TagList tags) + { + Name = name ?? string.Empty; + Timestamp = timestamp != default ? timestamp : DateTimeOffset.UtcNow; + +#if NET + // Read directly from the TagList's span so we avoid boxing the TagList (and its + // enumerator) as an IEnumerable just to copy its tags into the linked list below. + _tags = tags.Count > 0 ? new Activity.TagsLinkedList(tags.Tags) : null; +#else + _tags = tags.Count > 0 ? new Activity.TagsLinkedList((IEnumerable>)tags) : null; +#endif + } private ActivityEvent(string name, DateTimeOffset timestamp, IEnumerable>? tags, int tagsCount) {