Мне любопытно, чем IEnumerable
отличается от IObservable
под капотом. Я понимаю шаблоны pull и push соответственно, но как C# с точки зрения памяти и т. д. уведомляет подписчиков (для IObservable) о том, что он должен получить следующий бит данных в памяти для обработки? Как наблюдаемый экземпляр знаю, что у него были изменения в данных, которые нужно отправить подписчикам.
Мой вопрос связан с тестом, который я выполнял для чтения строк из файла. Общий размер файла составлял около 6 МБ.
Стандартное время: 4,7 с, строк: 36587
Затраченное время Rx: 0,68 с, строк: 36587
Как Rx может значительно улучшить обычную итерацию по каждой из строк в файле?
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();
}
}