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