Sono curioso di sapere come IEnumerable
differisce da IObservable
sotto il cofano. Capisco rispettivamente i modelli pull e push, ma come fa C#, in termini di memoria, ecc, a comunicare agli abbonati (per IObservable) che dovrebbe ricevere il successivo bit di dati in memoria da elaborare? In che modo l'istanza osservata sa che ha avuto un cambiamento nei dati da inviare agli abbonati.Come differisce IEnumerable da IObservable sotto il cofano?
La mia domanda proviene da un test che stavo eseguendo la lettura in linee da un file. Il file era di circa 6 Mb in totale.
Standard Time persi: 4.7s, linee: 36587
Rx Tempo impiegato: 0.68s, linee: 36587
Come è Rx in grado di migliorare in maniera massiccia un'iterazione normale sopra ciascuna delle righe nel file ?
private static void ReadStandardFile()
{
var timer = Stopwatch.StartNew();
var linesProcessed = 0;
foreach (var l in ReadLines(new FileStream(_filePath, FileMode.Open)))
{
var s = l.Split(',');
linesProcessed++;
}
timer.Stop();
_log.DebugFormat("Standard Time Taken: {0}s, lines: {1}",
timer.Elapsed.ToString(), linesProcessed);
}
private static void ReadRxFile()
{
var timer = Stopwatch.StartNew();
var linesProcessed = 0;
var query = ReadLines(new FileStream(_filePath, FileMode.Open)).ToObservable();
using (query.Subscribe((line) =>
{
var s = line.Split(',');
linesProcessed++;
}));
timer.Stop();
_log.DebugFormat("Rx Time Taken: {0}s, lines: {1}",
timer.Elapsed.ToString(), linesProcessed);
}
private static IEnumerable<string> ReadLines(Stream stream)
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
yield return reader.ReadLine();
}
}
Se si cambia l'ordine delle chiamate quando si esegue il benchmark dell'applicazione, l'RX è ancora più veloce? – user7116
I tempi sono invertiti! C'è un qualche tipo di ottimizzazione in corso! Infatti, l'Rx funziona più lentamente (circa 5 secondi). – David