Selaa lähdekoodia

Added some benchmarks for styled properties.

Steven Kirk 6 vuotta sitten
vanhempi
sitoutus
fc2439e0cf

+ 1 - 1
tests/Avalonia.Benchmarks/Base/Properties.cs

@@ -35,7 +35,7 @@ namespace Avalonia.Benchmarks.Base
 
         class Class1 : AvaloniaObject
         {
-            public static readonly AvaloniaProperty<int> IntProperty =
+            public static readonly StyledProperty<int> IntProperty =
                 AvaloniaProperty.Register<Class1, int>("Int");
         }
     }

+ 101 - 0
tests/Avalonia.Benchmarks/Base/StyledPropertyBenchmark.cs

@@ -0,0 +1,101 @@
+using System;
+using System.Collections.Generic;
+using System.Reactive.Subjects;
+using System.Text;
+using Avalonia.Data;
+using BenchmarkDotNet.Attributes;
+
+namespace Avalonia.Benchmarks.Base
+{
+    [MemoryDiagnoser]
+    public class StyledPropertyBenchmarks
+    {
+        [Benchmark]
+        public void Set_Int_Property_LocalValue()
+        {
+            var obj = new StyledClass();
+
+            for (var i = 0; i < 100; ++i)
+            {
+                obj.IntValue += 1;
+            }
+        }
+
+        [Benchmark]
+        public void Set_Int_Property_Multiple_Priorities()
+        {
+            var obj = new StyledClass();
+            var value = 0;
+
+            for (var i = 0; i < 100; ++i)
+            {
+                for (var p = BindingPriority.Animation; p <= BindingPriority.Style; ++p)
+                {
+                    obj.SetValue(StyledClass.IntValueProperty, value++, p);
+                }
+            }
+        }
+
+        [Benchmark]
+        public void Set_Int_Property_TemplatedParent()
+        {
+            var obj = new StyledClass();
+
+            for (var i = 0; i < 100; ++i)
+            {
+                obj.SetValue(StyledClass.IntValueProperty, obj.IntValue + 1, BindingPriority.TemplatedParent);
+            }
+        }
+
+        [Benchmark]
+        public void Bind_Int_Property_LocalValue()
+        {
+            var obj = new StyledClass();
+            var source = new Subject<BindingValue<int>>();
+
+            obj.Bind(StyledClass.IntValueProperty, source);
+
+            for (var i = 0; i < 100; ++i)
+            {
+                source.OnNext(i);
+            }
+        }
+
+        [Benchmark]
+        public void Bind_Int_Property_Multiple_Priorities()
+        {
+            var obj = new StyledClass();
+            var sources = new List<Subject<BindingValue<int>>>();
+            var value = 0;
+
+            for (var p = BindingPriority.Animation; p <= BindingPriority.Style; ++p)
+            {
+                var source = new Subject<BindingValue<int>>();
+                sources.Add(source);
+                obj.Bind(StyledClass.IntValueProperty, source, p);
+            }
+
+            for (var i = 0; i < 100; ++i)
+            {
+                foreach (var source in sources)
+                {
+                    source.OnNext(value++);
+                }
+            }
+        }
+
+        class StyledClass : AvaloniaObject
+        {
+            private int _intValue;
+
+            public static readonly StyledProperty<int> IntValueProperty =
+                AvaloniaProperty.Register<StyledClass, int>(nameof(IntValue));
+
+            public int IntValue
+            {
+                get => GetValue(IntValueProperty);
+                set => SetValue(IntValueProperty, value);
+            }
+        }
+    }
+}