【发布时间】:2012-04-02 06:07:59
【问题描述】:
我很好奇 IEnumerable 与 IObservable 的本质区别。我分别了解拉取和推送模式,但 C# 在内存等方面如何通知订阅者(对于 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 是否仍然更快?
-
时代倒退了!正在进行某种优化!事实上,Rx 的运行速度较慢(大约 5 秒)。
标签: c# system.reactive ienumerator