From e7d236e6ed8de7c2f03019faa05581cc2077d00a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 5 Jan 2024 15:30:45 +0100 Subject: [PATCH] Added TemplateBinding benchmarks. --- .../Avalonia.Benchmarks/Data/Binding_Setup.cs | 7 ++- .../Data/Binding_Values.cs | 4 +- .../Data/TemplateBinding_Setup.cs | 46 +++++++++++++++++ .../Data/TemplateBinding_Values.cs | 50 +++++++++++++++++++ 4 files changed, 101 insertions(+), 6 deletions(-) create mode 100644 tests/Avalonia.Benchmarks/Data/TemplateBinding_Setup.cs create mode 100644 tests/Avalonia.Benchmarks/Data/TemplateBinding_Values.cs diff --git a/tests/Avalonia.Benchmarks/Data/Binding_Setup.cs b/tests/Avalonia.Benchmarks/Data/Binding_Setup.cs index 4b3012d3e9..84f5bec10f 100644 --- a/tests/Avalonia.Benchmarks/Data/Binding_Setup.cs +++ b/tests/Avalonia.Benchmarks/Data/Binding_Setup.cs @@ -16,20 +16,19 @@ public class Binding_Setup } [Benchmark] - public void DataContext_Property_OneWay() + public void Setup_DataContext_Property_Binding_OneWay() { var target = _target; var binding = new Binding(nameof(_data.IntValue)); for (var i = 0; i < 100; ++i) { - var d = target.Bind(TestControl.IntValueProperty, binding); - d.Dispose(); + using var d = target.Bind(TestControl.IntValueProperty, binding); } } [Benchmark] - public void DataContext_Property_TwoWay() + public void Setup_DataContext_Property_Binding_TwoWay() { var target = _target; var binding = new Binding(nameof(_data.IntValue), mode: BindingMode.TwoWay); diff --git a/tests/Avalonia.Benchmarks/Data/Binding_Values.cs b/tests/Avalonia.Benchmarks/Data/Binding_Values.cs index b3a0e3719c..7cf30eee4d 100644 --- a/tests/Avalonia.Benchmarks/Data/Binding_Values.cs +++ b/tests/Avalonia.Benchmarks/Data/Binding_Values.cs @@ -16,7 +16,7 @@ public class Binding_Values } [Benchmark] - public void DataContext_Property_OneWay() + public void Produce_DataContext_Property_Binding_Value_OneWay() { _data.IntValue = -1; @@ -31,7 +31,7 @@ public class Binding_Values } [Benchmark] - public void DataContext_Property_TwoWay() + public void Produce_DataContext_Property_Binding_Value_TwoWay() { _data.IntValue = -1; diff --git a/tests/Avalonia.Benchmarks/Data/TemplateBinding_Setup.cs b/tests/Avalonia.Benchmarks/Data/TemplateBinding_Setup.cs new file mode 100644 index 0000000000..eee61fbb50 --- /dev/null +++ b/tests/Avalonia.Benchmarks/Data/TemplateBinding_Setup.cs @@ -0,0 +1,46 @@ +using Avalonia.Controls; +using Avalonia.Data; +using BenchmarkDotNet.Attributes; + +namespace Avalonia.Benchmarks.Data; + +[MemoryDiagnoser] +public class TemplateBinding_Setup +{ + private Decorator _target = new(); + private Control _templatedParent = new(); + + public TemplateBinding_Setup() + { + _target.TemplatedParent = _templatedParent; + _templatedParent.Tag = "parentTag"; + } + + [Benchmark] + public void Setup_TemplateBinding_OneWay() + { + var target = _target; + var binding = new TemplateBinding(Control.TagProperty); + + for (var i = 0; i < 100; ++i) + { + // Explicit cast to IBinding is required to prevent the IObservable + // overload being selected. + using var d = target.Bind(Control.TagProperty, (IBinding)binding); + } + } + + [Benchmark] + public void Setup_TemplateBinding_TwoWay() + { + var target = _target; + var binding = new TemplateBinding(Control.TagProperty) { Mode = BindingMode.TwoWay }; + + for (var i = 0; i < 100; ++i) + { + // Explicit cast to IBinding is required to prevent the IObservable + // overload being selected. + using var d = target.Bind(Control.TagProperty, (IBinding)binding); + } + } +} diff --git a/tests/Avalonia.Benchmarks/Data/TemplateBinding_Values.cs b/tests/Avalonia.Benchmarks/Data/TemplateBinding_Values.cs new file mode 100644 index 0000000000..4347e2091f --- /dev/null +++ b/tests/Avalonia.Benchmarks/Data/TemplateBinding_Values.cs @@ -0,0 +1,50 @@ +using Avalonia.Controls; +using Avalonia.Data; +using BenchmarkDotNet.Attributes; + +namespace Avalonia.Benchmarks.Data; + +[MemoryDiagnoser] +public class TemplateBinding_Values +{ + private Decorator _target = new(); + private Control _templatedParent = new(); + + public TemplateBinding_Values() + { + _target.TemplatedParent = _templatedParent; + } + + [Benchmark] + public void Produce_TemplateBinding_Value_OneWay() + { + var target = _target; + var binding = new TemplateBinding(Control.TagProperty); + + // Explicit cast to IBinding is required to prevent the IObservable + // overload being selected. + using var d = target.Bind(Control.TagProperty, (IBinding)binding); + + for (var i = 0; i < 100; ++i) + { + _templatedParent.Tag = i; + } + } + + [Benchmark] + public void Produce_TemplateBinding_Value_TwoWay() + { + var target = _target; + var binding = new TemplateBinding(Control.TagProperty) { Mode = BindingMode.TwoWay }; + + // Explicit cast to IBinding is required to prevent the IObservable + // overload being selected. + using var d = target.Bind(Control.TagProperty, (IBinding)binding); + + for (var i = 0; i < 100; ++i) + { + _templatedParent.Tag = i * 2; + target.SetCurrentValue(Control.TagProperty, (i * 2) + 1); + } + } +}