diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj
index 1f5ebac203..21d7b186b4 100644
--- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj
+++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj
@@ -49,6 +49,7 @@
+
@@ -100,7 +101,7 @@
-
+
\ No newline at end of file
diff --git a/tests/Avalonia.Benchmarks/Layout/Measure.cs b/tests/Avalonia.Benchmarks/Layout/Measure.cs
new file mode 100644
index 0000000000..d1fdae9971
--- /dev/null
+++ b/tests/Avalonia.Benchmarks/Layout/Measure.cs
@@ -0,0 +1,65 @@
+using System;
+using System.Collections.Generic;
+using Avalonia.Controls;
+using Avalonia.Layout;
+using Avalonia.UnitTests;
+using BenchmarkDotNet.Attributes;
+
+namespace Avalonia.Benchmarks.Layout
+{
+ [MemoryDiagnoser]
+ public class Measure : IDisposable
+ {
+ private IDisposable _app;
+ private TestRoot root;
+ private List controls = new List();
+
+ public Measure()
+ {
+ _app = UnitTestApplication.Start(TestServices.RealLayoutManager);
+
+ var panel = new StackPanel();
+ root = new TestRoot { Child = panel };
+ controls.Add(panel);
+ CreateChildren(panel, 3, 5);
+ LayoutManager.Instance.ExecuteInitialLayoutPass(root);
+ }
+
+ public void Dispose()
+ {
+ _app.Dispose();
+ }
+
+ [Benchmark]
+ public void Remeasure_Half()
+ {
+ var random = new Random(1);
+
+ foreach (var control in controls)
+ {
+ if (random.Next(2) == 0)
+ {
+ control.InvalidateMeasure();
+ }
+ }
+
+ LayoutManager.Instance.ExecuteLayoutPass();
+ }
+
+ private void CreateChildren(IPanel parent, int childCount, int iterations)
+ {
+ for (var i = 0; i < childCount; ++i)
+ {
+ var control = new StackPanel();
+ parent.Children.Add(control);
+
+ if (iterations > 0)
+ {
+ CreateChildren(control, childCount, iterations - 1);
+ }
+
+ controls.Add(control);
+ }
+ }
+ }
+}
diff --git a/tests/Avalonia.Benchmarks/Styling/ApplyStyling.cs b/tests/Avalonia.Benchmarks/Styling/ApplyStyling.cs
index 0af451efd2..33af55fdf9 100644
--- a/tests/Avalonia.Benchmarks/Styling/ApplyStyling.cs
+++ b/tests/Avalonia.Benchmarks/Styling/ApplyStyling.cs
@@ -11,6 +11,7 @@ using Avalonia.VisualTree;
namespace Avalonia.Benchmarks.Styling
{
+ [MemoryDiagnoser]
public class ApplyStyling : IDisposable
{
private IDisposable _app;