From 35ee4f79762f933ca12ad27c9a3bb7201cc24dcd Mon Sep 17 00:00:00 2001 From: ahopper Date: Wed, 20 Nov 2019 11:04:20 +0000 Subject: [PATCH] Reduce calls to ToArray in PublishNext --- .../Reactive/LightweightObservableBase.cs | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Base/Reactive/LightweightObservableBase.cs b/src/Avalonia.Base/Reactive/LightweightObservableBase.cs index 41009e4cd3..b6c7cecfdc 100644 --- a/src/Avalonia.Base/Reactive/LightweightObservableBase.cs +++ b/src/Avalonia.Base/Reactive/LightweightObservableBase.cs @@ -111,25 +111,38 @@ namespace Avalonia.Reactive protected abstract void Initialize(); protected abstract void Deinitialize(); - + protected void PublishNext(T value) { if (Volatile.Read(ref _observers) != null) { - IObserver[] observers; - + IObserver[] observers = null; + IObserver singleObserver = null; lock (this) { if (_observers == null) { return; } - observers = _observers.ToArray(); + if (_observers.Count == 1) + { + singleObserver = _observers[0]; + } + else + { + observers = _observers.ToArray(); + } } - - foreach (var observer in observers) + if (singleObserver != null) { - observer.OnNext(value); + singleObserver.OnNext(value); + } + else + { + foreach (var observer in observers) + { + observer.OnNext(value); + } } } }