committed by
Steven Kirk
8 changed files with 166 additions and 23 deletions
@ -0,0 +1,14 @@ |
|||||
|
namespace Avalonia.Controls |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Internal interface for listening to changes in <see cref="Classes"/> in a more
|
||||
|
/// performant manner than subscribing to CollectionChanged.
|
||||
|
/// </summary>
|
||||
|
internal interface IClassesChangedListener |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Notifies the listener that the <see cref="Classes"/> collection has changed.
|
||||
|
/// </summary>
|
||||
|
void Changed(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,85 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Runtime.CompilerServices; |
||||
|
using Avalonia.Controls; |
||||
|
using Avalonia.Styling; |
||||
|
using BenchmarkDotNet.Attributes; |
||||
|
|
||||
|
#nullable enable |
||||
|
|
||||
|
namespace Avalonia.Benchmarks.Styling |
||||
|
{ |
||||
|
[MemoryDiagnoser] |
||||
|
public class Style_ClassSelector |
||||
|
{ |
||||
|
private Style _style = null!; |
||||
|
|
||||
|
public Style_ClassSelector() |
||||
|
{ |
||||
|
RuntimeHelpers.RunClassConstructor(typeof(TestClass).TypeHandle); |
||||
|
} |
||||
|
|
||||
|
[GlobalSetup] |
||||
|
public void Setup() |
||||
|
{ |
||||
|
_style = new Style(x => x.OfType<TestClass>().Class("foo")) |
||||
|
{ |
||||
|
Setters = { new Setter(TestClass.StringProperty, "foo") } |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
[Benchmark(OperationsPerInvoke = 50)] |
||||
|
public void Apply() |
||||
|
{ |
||||
|
var target = new TestClass(); |
||||
|
|
||||
|
target.BeginBatchUpdate(); |
||||
|
|
||||
|
for (var i = 0; i < 50; ++i) |
||||
|
_style.TryAttach(target, null); |
||||
|
|
||||
|
target.EndBatchUpdate(); |
||||
|
} |
||||
|
|
||||
|
[Benchmark(OperationsPerInvoke = 50)] |
||||
|
public void Apply_Toggle() |
||||
|
{ |
||||
|
var target = new TestClass(); |
||||
|
|
||||
|
target.BeginBatchUpdate(); |
||||
|
|
||||
|
for (var i = 0; i < 50; ++i) |
||||
|
_style.TryAttach(target, null); |
||||
|
|
||||
|
target.EndBatchUpdate(); |
||||
|
|
||||
|
target.Classes.Add("foo"); |
||||
|
target.Classes.Remove("foo"); |
||||
|
} |
||||
|
|
||||
|
[Benchmark(OperationsPerInvoke = 50)] |
||||
|
public void Apply_Detach() |
||||
|
{ |
||||
|
var target = new TestClass(); |
||||
|
|
||||
|
target.BeginBatchUpdate(); |
||||
|
|
||||
|
for (var i = 0; i < 50; ++i) |
||||
|
_style.TryAttach(target, null); |
||||
|
|
||||
|
target.EndBatchUpdate(); |
||||
|
|
||||
|
target.DetachStyles(); |
||||
|
} |
||||
|
|
||||
|
private class TestClass : Control |
||||
|
{ |
||||
|
public static readonly StyledProperty<string?> StringProperty = |
||||
|
AvaloniaProperty.Register<TestClass, string?>("String"); |
||||
|
public void DetachStyles() => InvalidateStyles(); |
||||
|
} |
||||
|
|
||||
|
private class TestClass2 : Control |
||||
|
{ |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue