IEnumerable
がフードの下でIObservable
とどのように異なるのか不思議です。私はプルとプッシュのパターンをそれぞれ理解していますが、C#はメモリの面でどのように処理するメモリ内の次のビットのデータを受け取るべきかを(IObservableのために)加入者に通知しますか?観察されたインスタンスは、加入者にプッシュするデータが変更されていることをどのように知っていますか。IEnumerableとIObservableの違いは何ですか?
私の質問は、私がファイルから行を読み込んで実行していたテストから来ています。ファイルは合計で約6Mbでした。
標準時撮影:4.7s、ライン:36587
Rxの時間は、撮影:0.68s、行:
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();
}
}
このアプリケーションのベンチマーク時に通話の順序を切り替えると、RXはまだ高速ですか? – user7116
時間が逆転しました!何らかの最適化が進行中です!実際、Rxは遅く(約5秒)実行されます。 – David