From 28c5ede826714a9ac80eabf903a159d8fffe07e8 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Fri, 17 Jun 2022 15:18:17 -0700 Subject: [PATCH 1/3] Reduce allocations when tracing routed events. --- .../System/Windows/EventRoute.cs | 46 ++++++++++++------- 1 file changed, 29 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs index b10e199e26f..892f52f9f1b 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs @@ -195,25 +195,28 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais if( TraceRoutedEvent.IsEnabled ) { + _traceArguments ??= new object[3]; + _traceArguments[0] = _routeItemList[i].Target; + _traceArguments[1] = args; + _traceArguments[2] = args.Handled ? _true : _false; TraceRoutedEvent.Trace( TraceEventType.Start, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); - + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } _routeItemList[i].InvokeHandler(args); if( TraceRoutedEvent.IsEnabled ) { + _traceArguments ??= new object[3]; + _traceArguments[0] = _routeItemList[i].Target; + _traceArguments[1] = args; + _traceArguments[2] = args.Handled ? _true : _false; TraceRoutedEvent.Trace( TraceEventType.Stop, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } @@ -266,12 +269,14 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais if( TraceRoutedEvent.IsEnabled ) { + _traceArguments ??= new object[3]; + _traceArguments[0] = _routeItemList[i].Target; + _traceArguments[1] = args; + _traceArguments[2] = args.Handled ? _true : _false; TraceRoutedEvent.Trace( TraceEventType.Start, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } // Invoke listeners @@ -279,12 +284,14 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais if( TraceRoutedEvent.IsEnabled ) { + _traceArguments ??= new object[3]; + _traceArguments[0] = _routeItemList[i].Target; + _traceArguments[1] = args; + _traceArguments[2] = args.Handled ? _true : _false; TraceRoutedEvent.Trace( TraceEventType.Stop, - TraceRoutedEvent.InvokeHandlers, - _routeItemList[i].Target, - args, - args.Handled ); + TraceRoutedEvent.InvokeHandlers, + _traceArguments); } } @@ -552,6 +559,11 @@ internal void Clear() // Stores Source Items for separated trees private FrugalStructList _sourceItemList; + // Stores arguments that are passed to TraceRoutedEvent.Trace (to reduce allocations) + private object[] _traceArguments; + private static readonly object _true = true; + private static readonly object _false = false; + #endregion Data } } From fa6bed0b86afbec54a0884dd5d88c52c875585f5 Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Fri, 17 Jun 2022 15:40:31 -0700 Subject: [PATCH 2/3] Remove redundant code. --- .../System/Windows/EventRoute.cs | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs index 892f52f9f1b..10d7a04ca6b 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs @@ -193,7 +193,8 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais // Invoke listeners - if( TraceRoutedEvent.IsEnabled ) + var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled; + if ( traceRoutedEventIsEnabled ) { _traceArguments ??= new object[3]; _traceArguments[0] = _routeItemList[i].Target; @@ -207,11 +208,8 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais _routeItemList[i].InvokeHandler(args); - if( TraceRoutedEvent.IsEnabled ) + if( traceRoutedEventIsEnabled ) { - _traceArguments ??= new object[3]; - _traceArguments[0] = _routeItemList[i].Target; - _traceArguments[1] = args; _traceArguments[2] = args.Handled ? _true : _false; TraceRoutedEvent.Trace( TraceEventType.Stop, @@ -267,7 +265,8 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais } - if( TraceRoutedEvent.IsEnabled ) + var traceRoutedEventIsEnabled = TraceRoutedEvent.IsEnabled; + if ( traceRoutedEventIsEnabled ) { _traceArguments ??= new object[3]; _traceArguments[0] = _routeItemList[i].Target; @@ -282,11 +281,8 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais // Invoke listeners _routeItemList[i].InvokeHandler(args); - if( TraceRoutedEvent.IsEnabled ) + if (traceRoutedEventIsEnabled) { - _traceArguments ??= new object[3]; - _traceArguments[0] = _routeItemList[i].Target; - _traceArguments[1] = args; _traceArguments[2] = args.Handled ? _true : _false; TraceRoutedEvent.Trace( TraceEventType.Stop, From 54cc33864b0943bf98ced8ca3be427f94e78b3be Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Sun, 19 Jun 2022 22:36:11 -0700 Subject: [PATCH 3/3] Use BooleanBoxes. --- .../src/PresentationCore/System/Windows/EventRoute.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs index 10d7a04ca6b..7dd434a08e7 100644 --- a/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs +++ b/src/Microsoft.DotNet.Wpf/src/PresentationCore/System/Windows/EventRoute.cs @@ -11,6 +11,7 @@ using SR=MS.Internal.PresentationCore.SR; using SRID=MS.Internal.PresentationCore.SRID; using MS.Internal; +using MS.Internal.KnownBoxes; namespace System.Windows { @@ -199,7 +200,7 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais _traceArguments ??= new object[3]; _traceArguments[0] = _routeItemList[i].Target; _traceArguments[1] = args; - _traceArguments[2] = args.Handled ? _true : _false; + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Start, TraceRoutedEvent.InvokeHandlers, @@ -210,7 +211,7 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais if( traceRoutedEventIsEnabled ) { - _traceArguments[2] = args.Handled ? _true : _false; + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Stop, TraceRoutedEvent.InvokeHandlers, @@ -271,7 +272,7 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais _traceArguments ??= new object[3]; _traceArguments[0] = _routeItemList[i].Target; _traceArguments[1] = args; - _traceArguments[2] = args.Handled ? _true : _false; + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Start, TraceRoutedEvent.InvokeHandlers, @@ -283,7 +284,7 @@ private void InvokeHandlersImpl(object source, RoutedEventArgs args, bool reRais if (traceRoutedEventIsEnabled) { - _traceArguments[2] = args.Handled ? _true : _false; + _traceArguments[2] = BooleanBoxes.Box(args.Handled); TraceRoutedEvent.Trace( TraceEventType.Stop, TraceRoutedEvent.InvokeHandlers, @@ -557,8 +558,6 @@ internal void Clear() // Stores arguments that are passed to TraceRoutedEvent.Trace (to reduce allocations) private object[] _traceArguments; - private static readonly object _true = true; - private static readonly object _false = false; #endregion Data }