Browse Source

Reduce calls to ToArray in PublishNext

ahopper 6 years ago
parent
commit
35ee4f7976
1 changed files with 20 additions and 7 deletions
  1. 20 7
      src/Avalonia.Base/Reactive/LightweightObservableBase.cs

+ 20 - 7
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<T>[] observers;
-
+                IObserver<T>[] observers = null;
+                IObserver<T> 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);
+                    }
                 }
             }
         }