Browse Source

Merge pull request #3279 from ahopper/perf-reduce-allocation-in-lightweightobservablebase

Reduce calls to ToArray in LightweightObservableBase PublishNext
pull/3282/head
Benedikt Stebner 7 years ago
committed by GitHub
parent
commit
149a30b5b7
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 25
      src/Avalonia.Base/Reactive/LightweightObservableBase.cs
  2. 16
      tests/Avalonia.Benchmarks/Data/BindingsBenchmark.cs

25
src/Avalonia.Base/Reactive/LightweightObservableBase.cs

@ -116,20 +116,33 @@ namespace Avalonia.Reactive
{ {
if (Volatile.Read(ref _observers) != null) if (Volatile.Read(ref _observers) != null)
{ {
IObserver<T>[] observers; IObserver<T>[] observers = null;
IObserver<T> singleObserver = null;
lock (this) lock (this)
{ {
if (_observers == null) if (_observers == null)
{ {
return; return;
} }
observers = _observers.ToArray(); if (_observers.Count == 1)
{
singleObserver = _observers[0];
}
else
{
observers = _observers.ToArray();
}
} }
if (singleObserver != null)
foreach (var observer in observers)
{ {
observer.OnNext(value); singleObserver.OnNext(value);
}
else
{
foreach (var observer in observers)
{
observer.OnNext(value);
}
} }
} }
} }

16
tests/Avalonia.Benchmarks/Data/BindingsBenchmark.cs

@ -19,6 +19,22 @@ namespace Avalonia.Benchmarks.Data
instance.Bind(TestClass.IntValueProperty, binding); instance.Bind(TestClass.IntValueProperty, binding);
} }
[Benchmark]
public void UpdateTwoWayBinding_Via_Binding()
{
var instance = new TestClass();
var binding = new Binding(nameof(TestClass.BoundValue), BindingMode.TwoWay)
{
Source = instance
};
instance.Bind(TestClass.IntValueProperty, binding);
for (int i = 0; i < 60; i++)
{
instance.IntValue = i;
}
}
private class TestClass : AvaloniaObject private class TestClass : AvaloniaObject
{ {
public static readonly StyledProperty<int> IntValueProperty = public static readonly StyledProperty<int> IntValueProperty =

Loading…
Cancel
Save