ボンネットの下とどうIEnumerable
違うのか興味があります。IObservable
プル パターンとプッシュ パターンはそれぞれ理解していますが、C# は、メモリなどの観点から、処理するメモリ内の次のデータ ビットを受信する必要があることをサブスクライバー (IObservable 用) にどのように通知しますか? 監視対象のインスタンスは、サブスクライバーにプッシュするデータに変更があったことをどのように認識しますか。
私の質問は、ファイルから行を読み取って実行していたテストから来ています。ファイルは合計で約 6Mb でした。
標準所要時間: 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();
}
}