Perché IEnumerable.ToObservable è così lento?

Perché IEnumerable.ToObservable è così lento?

Questa è la differenza tra un osservabile ben educato e un osservabile "roll-your-own-perché-pensi-più-veloce-è-meglio-ma-non-è-".

Quando ti immergi abbastanza nella fonte, scopri questa deliziosa piccola riga:

scheduler.Schedule(this, (IScheduler innerScheduler, _ @this) => @this.LoopRec(innerScheduler));

Sta effettivamente chiamando hasNext = enumerator.MoveNext(); una volta per iterazione ricorsiva pianificata.

Ciò ti consente di scegliere lo scheduler per il tuo .ToObservable(schedulerOfYourChoice) chiama.

Con le altre opzioni che hai scelto hai creato una serie di chiamate a .OnNext. che praticamente non fanno nulla. Method2 non ha nemmeno un .Subscribe chiama.

Entrambi Method2 e Method1 eseguito utilizzando il thread corrente ed entrambi eseguiti fino al completamento prima che la sottoscrizione sia terminata. Stanno bloccando le chiamate. Possono causare condizioni di gara.

Method1 è l'unico che si comporta bene come osservabile. È asincrono e può funzionare indipendentemente dall'abbonato.

Tieni presente che gli osservabili sono raccolte che corrono nel tempo. In genere hanno una sorgente asincrona o un timer o rispondono a stimoli esterni. Non scappano spesso da un semplice enumerabile. Se stai lavorando con un enumerable, il funzionamento sincrono dovrebbe funzionare più velocemente.

La velocità non è l'obiettivo di Rx. L'obiettivo è eseguire query complesse su valori push basati sul tempo.