Чем IEnumerable отличается от IObservable под капотом?

Мне любопытно, чем 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();
    }
}
7
задан Richard Anthony Hein 16 March 2012 в 18:58
поделиться