瀏覽代碼

Added benchmark for fluent RepeatButton.

As that's where #5027 was showing up most.
Steven Kirk 4 年之前
父節點
當前提交
7469597712

+ 1 - 0
tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj

@@ -12,6 +12,7 @@
     <ProjectReference Include="..\..\src\Avalonia.Input\Avalonia.Input.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Interactivity\Avalonia.Interactivity.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Layout\Avalonia.Layout.csproj" />
+    <ProjectReference Include="..\..\src\Avalonia.Themes.Fluent\Avalonia.Themes.Fluent.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Visuals\Avalonia.Visuals.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Styling\Avalonia.Styling.csproj" />
     <ProjectReference Include="..\..\src\Avalonia.Themes.Default\Avalonia.Themes.Default.csproj" />

+ 74 - 0
tests/Avalonia.Benchmarks/Themes/FluentBenchmark.cs

@@ -0,0 +1,74 @@
+using System;
+using Avalonia.Controls;
+using Avalonia.Markup.Xaml;
+using Avalonia.Markup.Xaml.Styling;
+using Avalonia.Platform;
+using Avalonia.Shared.PlatformSupport;
+using Avalonia.Styling;
+using Avalonia.UnitTests;
+using BenchmarkDotNet.Attributes;
+using Moq;
+
+namespace Avalonia.Benchmarks.Themes
+{
+    [MemoryDiagnoser]
+    public class FluentBenchmark
+    {
+        private readonly IDisposable _app;
+        private readonly TestRoot _root;
+
+        public FluentBenchmark()
+        {
+            _app = CreateApp();
+            _root = new TestRoot(true, null)
+            {
+                Renderer = new NullRenderer()
+            };
+
+            _root.LayoutManager.ExecuteInitialLayoutPass();
+        }
+
+        public void Dispose()
+        {
+            _app.Dispose();
+        }
+
+        [Benchmark]
+        public void RepeatButton()
+        {
+            var button = new RepeatButton();
+            _root.Child = button;
+            _root.LayoutManager.ExecuteLayoutPass();
+        }
+
+        private static IDisposable CreateApp()
+        {
+            var services = new TestServices(
+                assetLoader: new AssetLoader(),
+                globalClock: new MockGlobalClock(),
+                platform: new AppBuilder().RuntimePlatform,
+                renderInterface: new MockPlatformRenderInterface(),
+                standardCursorFactory: Mock.Of<IStandardCursorFactory>(),
+                styler: new Styler(),
+                theme: () => LoadFluentTheme(),
+                threadingInterface: new NullThreadingPlatform(),
+                fontManagerImpl: new MockFontManagerImpl(),
+                textShaperImpl: new MockTextShaperImpl(),
+                windowingPlatform: new MockWindowingPlatform());
+
+            return UnitTestApplication.Start(services);
+        }
+
+        private static Styles LoadFluentTheme()
+        {
+            AssetLoader.RegisterResUriParsers();
+            return new Styles
+            {
+                new StyleInclude(new Uri("avares://Avalonia.Benchmarks"))
+                {
+                    Source = new Uri("avares://Avalonia.Themes.Fluent/Accents/FluentDark.xaml")
+                }
+            };
+        }
+    }
+}

+ 1 - 1
tests/Avalonia.UnitTests/UnitTestApplication.cs

@@ -25,6 +25,7 @@ namespace Avalonia.UnitTests
         public UnitTestApplication(TestServices services)
         {
             _services = services ?? new TestServices();
+            AvaloniaLocator.CurrentMutable.BindToSelf<Application>(this);
             RegisterServices();
         }
 
@@ -36,7 +37,6 @@ namespace Avalonia.UnitTests
         {
             var scope = AvaloniaLocator.EnterScope();
             var app = new UnitTestApplication(services);
-            AvaloniaLocator.CurrentMutable.BindToSelf<Application>(app);
             Dispatcher.UIThread.UpdateServices();
             return Disposable.Create(() =>
             {