Skip to content

Fixing performance regression in EventSource #117549

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

Merged
merged 3 commits into from
Jul 14, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1442,7 +1442,10 @@ protected unsafe void WriteEventWithRelatedActivityIdCore(int eventId, Guid* rel
if (ex is EventSourceException)
throw;
else
ThrowEventSourceException(m_eventData[eventId].Name, ex);
{
ref EventMetadata metadata = ref CollectionsMarshal.GetValueRefOrNullRef(m_eventData, eventId);
ThrowEventSourceException(metadata.Name, ex);
}
}
}
}
Expand Down Expand Up @@ -2072,7 +2075,10 @@ private unsafe void WriteEventVarargs(int eventId, Guid* childActivityID, object
if (ex is EventSourceException)
throw;
else
ThrowEventSourceException(m_eventData[eventId].Name, ex);
{
ref EventMetadata metadata = ref CollectionsMarshal.GetValueRefOrNullRef(m_eventData, eventId);
ThrowEventSourceException(metadata.Name, ex);
}
}
}
}
Expand All @@ -2084,7 +2090,8 @@ private unsafe void WriteEventVarargs(int eventId, Guid* childActivityID, object
private object?[] SerializeEventArgs(int eventId, object?[] args)
{
Debug.Assert(m_eventData != null);
TraceLoggingEventTypes eventTypes = m_eventData[eventId].TraceLoggingEventTypes;
ref EventMetadata metadata = ref CollectionsMarshal.GetValueRefOrNullRef(m_eventData, eventId);
TraceLoggingEventTypes eventTypes = metadata.TraceLoggingEventTypes;
int paramCount = Math.Min(eventTypes.typeInfos.Length, args.Length); // parameter count mismatch get logged in LogEventArgsMismatches
var eventData = new object?[eventTypes.typeInfos.Length];
for (int i = 0; i < paramCount; i++)
Expand All @@ -2103,7 +2110,8 @@ private unsafe void WriteEventVarargs(int eventId, Guid* childActivityID, object
private void LogEventArgsMismatches(int eventId, object?[] args)
{
Debug.Assert(m_eventData != null);
ParameterInfo[] infos = m_eventData[eventId].Parameters;
ref EventMetadata metadata = ref CollectionsMarshal.GetValueRefOrNullRef(m_eventData, eventId);
ParameterInfo[] infos = metadata.Parameters;

if (args.Length != infos.Length)
{
Expand Down Expand Up @@ -2360,9 +2368,10 @@ private bool IsEnabledByDefault(int eventNum, bool enable, EventLevel currentLev
return false;

Debug.Assert(m_eventData != null);
EventLevel eventLevel = (EventLevel)m_eventData[eventNum].Descriptor.Level;
EventKeywords eventKeywords = unchecked((EventKeywords)((ulong)m_eventData[eventNum].Descriptor.Keywords & (~(SessionMask.All.ToEventKeywords()))));
EventChannel channel = unchecked((EventChannel)m_eventData[eventNum].Descriptor.Channel);
ref EventMetadata metadata = ref CollectionsMarshal.GetValueRefOrNullRef(m_eventData, eventNum);
EventLevel eventLevel = (EventLevel)metadata.Descriptor.Level;
EventKeywords eventKeywords = unchecked((EventKeywords)((ulong)metadata.Descriptor.Keywords & (~(SessionMask.All.ToEventKeywords()))));
EventChannel channel = unchecked((EventChannel)metadata.Descriptor.Channel);

return IsEnabledCommon(enable, currentLevel, currentMatchAnyKeyword, eventLevel, eventKeywords, channel);
}
Expand Down
Loading