committed by
GitHub
2 changed files with 142 additions and 0 deletions
@ -0,0 +1,113 @@ |
|||
using System; |
|||
using Avalonia.Controls; |
|||
using Avalonia.Platform; |
|||
using Avalonia.PlatformSupport; |
|||
using Avalonia.Styling; |
|||
using Avalonia.UnitTests; |
|||
using BenchmarkDotNet.Attributes; |
|||
using Moq; |
|||
|
|||
namespace Avalonia.Benchmarks.Styling |
|||
{ |
|||
[MemoryDiagnoser] |
|||
public class ResourceBenchmarks : IDisposable |
|||
{ |
|||
private readonly Control _searchStart; |
|||
private readonly IDisposable _app; |
|||
|
|||
private static IDisposable CreateApp() |
|||
{ |
|||
var services = new TestServices( |
|||
assetLoader: new AssetLoader(), |
|||
globalClock: new MockGlobalClock(), |
|||
platform: new AppBuilder().RuntimePlatform, |
|||
renderInterface: new MockPlatformRenderInterface(), |
|||
standardCursorFactory: Mock.Of<ICursorFactory>(), |
|||
styler: new Styler(), |
|||
theme: () => CreateTheme(), |
|||
threadingInterface: new NullThreadingPlatform(), |
|||
fontManagerImpl: new MockFontManagerImpl(), |
|||
textShaperImpl: new MockTextShaperImpl(), |
|||
windowingPlatform: new MockWindowingPlatform()); |
|||
|
|||
return UnitTestApplication.Start(services); |
|||
} |
|||
|
|||
private static Styles CreateTheme() |
|||
{ |
|||
AssetLoader.RegisterResUriParsers(); |
|||
|
|||
var preHost = new Style(); |
|||
preHost.Resources.Add("preTheme", null); |
|||
|
|||
var postHost = new Style(); |
|||
postHost.Resources.Add("postTheme", null); |
|||
|
|||
return new Styles |
|||
{ |
|||
preHost, |
|||
new TestStyles(50, 3, 5), |
|||
postHost |
|||
}; |
|||
} |
|||
|
|||
public void Dispose() |
|||
{ |
|||
_app.Dispose(); |
|||
} |
|||
|
|||
public ResourceBenchmarks() |
|||
{ |
|||
_searchStart = new Button(); |
|||
|
|||
_app = CreateApp(); |
|||
|
|||
Decorator root = new TestRoot(true, null) |
|||
{ |
|||
Renderer = new NullRenderer() |
|||
}; |
|||
|
|||
var current = root; |
|||
|
|||
for (int i = 0; i < 10; i++) |
|||
{ |
|||
var child = new Decorator(); |
|||
|
|||
current.Child = child; |
|||
|
|||
current = child; |
|||
} |
|||
|
|||
current.Child = _searchStart; |
|||
} |
|||
|
|||
private const int LookupCount = 100; |
|||
|
|||
[Benchmark] |
|||
public void FindPreResource() |
|||
{ |
|||
for (int i = 0; i < LookupCount; ++i) |
|||
{ |
|||
_searchStart.FindResource("preTheme"); |
|||
} |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void FindPostResource() |
|||
{ |
|||
for (int i = 0; i < LookupCount; ++i) |
|||
{ |
|||
_searchStart.FindResource("postTheme"); |
|||
} |
|||
} |
|||
|
|||
[Benchmark] |
|||
public void FindNotExistingResource() |
|||
{ |
|||
for (int i = 0; i < LookupCount; ++i) |
|||
{ |
|||
_searchStart.FindResource("notPresent"); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
@ -0,0 +1,29 @@ |
|||
using Avalonia.Styling; |
|||
|
|||
namespace Avalonia.Benchmarks |
|||
{ |
|||
public class TestStyles : Styles |
|||
{ |
|||
public TestStyles(int childStylesCount, int childInnerStyleCount, int childResourceCount) |
|||
{ |
|||
for (int i = 0; i < childStylesCount; i++) |
|||
{ |
|||
var childStyles = new Styles(); |
|||
|
|||
for (int j = 0; j < childInnerStyleCount; j++) |
|||
{ |
|||
var childStyle = new Style(); |
|||
|
|||
for (int k = 0; k < childResourceCount; k++) |
|||
{ |
|||
childStyle.Resources.Add($"resource.{i}.{j}.{k}", null); |
|||
} |
|||
|
|||
childStyles.Add(childStyle); |
|||
} |
|||
|
|||
Add(childStyles); |
|||
} |
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue