Tengo curiosidad sobre cómo IEnumerable
difiere de IObservable
debajo del capó. Entiendo los patrones de extracción y empuje respectivamente, pero ¿cómo notifica C#, en términos de memoria, etc. a los suscriptores (para IObservable) que debe recibir el siguiente bit de datos en la memoria para procesar? ¿Cómo sabe la instancia observada que ha tenido un cambio en los datos para enviar a los suscriptores?¿Cómo se diferencia IEnumerable de IObservable debajo del capó?
Mi pregunta proviene de una prueba que estaba realizando leyendo en líneas de un archivo. El archivo tenía aproximadamente 6 Mb en total.
Tiempo estándar tomados: 4.7s, líneas: 36587
Rx tiempo empleado: 0.68s, líneas: 36587
Cómo es Rx capaz de mejorar de forma masiva una iteración de lo normal en cada una de las líneas en el archivo ?
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();
}
}
Si cambia el orden de sus llamadas cuando compara esta aplicación, ¿la RX es aún más rápida? – user7116
¡Los tiempos se invierten! ¡Hay algún tipo de optimización! De hecho, el Rx uno corre más despacio (alrededor de 5 segundos). – David