From 7f33ffaf8b6446e8ccca4c5b9f103b476f8e8960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Wed, 11 Sep 2019 10:30:49 +0200 Subject: [PATCH 1/2] Avoid allocations when running UpdateIsEffectivelyEnabled. --- src/Avalonia.Input/InputElement.cs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Input/InputElement.cs b/src/Avalonia.Input/InputElement.cs index 4b4ab177b8..5b9b2676c0 100644 --- a/src/Avalonia.Input/InputElement.cs +++ b/src/Avalonia.Input/InputElement.cs @@ -565,9 +565,13 @@ namespace Avalonia.Input { IsEffectivelyEnabled = IsEnabledCore && (parent?.IsEffectivelyEnabled ?? true); - foreach (var child in this.GetVisualChildren().OfType()) + var children = VisualChildren; + + for (int i = 0; i < children.Count; ++i) { - child.UpdateIsEffectivelyEnabled(this); + var child = children[i] as InputElement; + + child?.UpdateIsEffectivelyEnabled(this); } } } From 7237fa979e9d8482d418735746198db19a997644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dariusz=20Komosi=C5=84ski?= Date: Wed, 11 Sep 2019 10:40:43 +0200 Subject: [PATCH 2/2] Add comments. --- src/Avalonia.Input/InputElement.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Avalonia.Input/InputElement.cs b/src/Avalonia.Input/InputElement.cs index 5b9b2676c0..47e85416cf 100644 --- a/src/Avalonia.Input/InputElement.cs +++ b/src/Avalonia.Input/InputElement.cs @@ -565,8 +565,12 @@ namespace Avalonia.Input { IsEffectivelyEnabled = IsEnabledCore && (parent?.IsEffectivelyEnabled ?? true); + // PERF-SENSITIVE: This is called on entire hierarchy and using foreach or LINQ + // will cause extra allocations and overhead. + var children = VisualChildren; + // ReSharper disable once ForCanBeConvertedToForeach for (int i = 0; i < children.Count; ++i) { var child = children[i] as InputElement;