Skip to content

Commit a0121f7

Browse files
authored
Reduce allocations when tracing routed events (#6700)
* Reduce allocations when tracing routed events. * Remove redundant code. * Use BooleanBoxes.
1 parent 3132deb commit a0121f7

File tree

1 file changed

+28
-21
lines changed
  • src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows

1 file changed

+28
-21
lines changed

src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
using SR=MS.Internal.PresentationCore.SR;
1212
using MS.Internal;
13+
using MS.Internal.KnownBoxes;
1314

1415
namespace System.Windows
1516
{
@@ -177,27 +178,28 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais
177178

178179
// Invoke listeners
179180

180-
if( TraceRoutedEvent.IsEnabled )
181+
var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled;
182+
if ( traceRoutedEventIsEnabled )
181183
{
184+
_traceArguments ??= new object[3];
185+
_traceArguments[0] = _routeItemList[i].Target;
186+
_traceArguments[1] = args;
187+
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
182188
TraceRoutedEvent.Trace(
183189
TraceEventType.Start,
184-
TraceRoutedEvent.InvokeHandlers,
185-
_routeItemList[i].Target,
186-
args,
187-
args.Handled );
188-
190+
TraceRoutedEvent.InvokeHandlers,
191+
_traceArguments);
189192
}
190193

191194
_routeItemList[i].InvokeHandler(args);
192195

193-
if( TraceRoutedEvent.IsEnabled )
196+
if( traceRoutedEventIsEnabled )
194197
{
198+
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
195199
TraceRoutedEvent.Trace(
196200
TraceEventType.Stop,
197-
TraceRoutedEvent.InvokeHandlers,
198-
_routeItemList[i].Target,
199-
args,
200-
args.Handled );
201+
TraceRoutedEvent.InvokeHandlers,
202+
_traceArguments);
201203
}
202204

203205

@@ -248,27 +250,29 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais
248250
}
249251

250252

251-
if( TraceRoutedEvent.IsEnabled )
253+
var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled;
254+
if ( traceRoutedEventIsEnabled )
252255
{
256+
_traceArguments ??= new object[3];
257+
_traceArguments[0] = _routeItemList[i].Target;
258+
_traceArguments[1] = args;
259+
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
253260
TraceRoutedEvent.Trace(
254261
TraceEventType.Start,
255-
TraceRoutedEvent.InvokeHandlers,
256-
_routeItemList[i].Target,
257-
args,
258-
args.Handled );
262+
TraceRoutedEvent.InvokeHandlers,
263+
_traceArguments);
259264
}
260265

261266
// Invoke listeners
262267
_routeItemList[i].InvokeHandler(args);
263268

264-
if( TraceRoutedEvent.IsEnabled )
269+
if (traceRoutedEventIsEnabled)
265270
{
271+
_traceArguments[2] = BooleanBoxes.Box(args.Handled);
266272
TraceRoutedEvent.Trace(
267273
TraceEventType.Stop,
268-
TraceRoutedEvent.InvokeHandlers,
269-
_routeItemList[i].Target,
270-
args,
271-
args.Handled );
274+
TraceRoutedEvent.InvokeHandlers,
275+
_traceArguments);
272276
}
273277

274278
}
@@ -536,6 +540,9 @@ internal void Clear()
536540
// Stores Source Items for separated trees
537541
private FrugalStructList<SourceItem> _sourceItemList;
538542

543+
// Stores arguments that are passed to TraceRoutedEvent.Trace (to reduce allocations)
544+
private object[] _traceArguments;
545+
539546
#endregion Data
540547
}
541548
}

0 commit comments

Comments
 (0)