Browse Source

Improve measure benchmark.

pull/3243/head
Dariusz Komosinski 6 years ago
parent
commit
993840a612
  1. 35
      tests/Avalonia.Benchmarks/ControlHierarchyCreator.cs
  2. 51
      tests/Avalonia.Benchmarks/Layout/Measure.cs
  3. 44
      tests/Avalonia.Benchmarks/NullRenderer.cs

35
tests/Avalonia.Benchmarks/ControlHierarchyCreator.cs

@ -0,0 +1,35 @@
using System.Collections.Generic;
using Avalonia.Controls;
namespace Avalonia.Benchmarks
{
internal class ControlHierarchyCreator
{
public static List<Control> CreateChildren(List<Control> controls, IPanel parent, int childCount, int innerCount, int iterations)
{
for (var i = 0; i < childCount; ++i)
{
var control = new StackPanel();
parent.Children.Add(control);
for (int j = 0; j < innerCount; ++j)
{
var child = new Button();
parent.Children.Add(child);
controls.Add(child);
}
if (iterations > 0)
{
CreateChildren(controls, control, childCount, innerCount, iterations - 1);
}
controls.Add(control);
}
return controls;
}
}
}

51
tests/Avalonia.Benchmarks/Layout/Measure.cs

@ -1,7 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
using Avalonia.Controls;
using Avalonia.Layout;
using Avalonia.UnitTests;
using BenchmarkDotNet.Attributes;
@ -10,48 +9,34 @@ namespace Avalonia.Benchmarks.Layout
[MemoryDiagnoser]
public class Measure
{
private TestRoot root;
private List<Control> controls = new List<Control>();
private readonly TestRoot _root;
private readonly List<Control> _controls = new List<Control>();
public Measure()
{
var panel = new StackPanel();
root = new TestRoot { Child = panel };
controls.Add(panel);
CreateChildren(panel, 3, 5);
root.LayoutManager.ExecuteInitialLayoutPass(root);
}
[Benchmark]
public void Remeasure_Half()
{
var random = new Random(1);
foreach (var control in controls)
_root = new TestRoot
{
if (random.Next(2) == 0)
{
control.InvalidateMeasure();
}
}
Child = panel,
Renderer = new NullRenderer()
};
root.LayoutManager.ExecuteLayoutPass();
_controls.Add(panel);
_controls = ControlHierarchyCreator.CreateChildren(_controls, panel, 3, 5, 5);
_root.LayoutManager.ExecuteInitialLayoutPass(_root);
}
private void CreateChildren(IPanel parent, int childCount, int iterations)
[Benchmark, MethodImpl(MethodImplOptions.NoInlining)]
public void Remeasure()
{
for (var i = 0; i < childCount; ++i)
foreach (var control in _controls)
{
var control = new StackPanel();
parent.Children.Add(control);
if (iterations > 0)
{
CreateChildren(control, childCount, iterations - 1);
}
controls.Add(control);
control.InvalidateMeasure();
}
_root.LayoutManager.ExecuteLayoutPass();
}
}
}

44
tests/Avalonia.Benchmarks/NullRenderer.cs

@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using Avalonia.Rendering;
using Avalonia.VisualTree;
namespace Avalonia.Benchmarks
{
internal class NullRenderer : IRenderer
{
public bool DrawFps { get; set; }
public bool DrawDirtyRects { get; set; }
public event EventHandler<SceneInvalidatedEventArgs> SceneInvalidated;
public void AddDirty(IVisual visual)
{
}
public void Dispose()
{
}
public IEnumerable<IVisual> HitTest(Point p, IVisual root, Func<IVisual, bool> filter) => null;
public void Paint(Rect rect)
{
}
public void RecalculateChildren(IVisual visual)
{
}
public void Resized(Size size)
{
}
public void Start()
{
}
public void Stop()
{
}
}
}
Loading…
Cancel
Save