gpt4 book ai didi

c# - IEnumerable 在底层与 IObservable 有何不同?

转载 作者:太空狗 更新时间:2023-10-29 20:25:04 24 4
gpt4 key购买 nike

我很好奇 IEnumerableIObservable 在底层有何不同。我分别了解拉和推模式,但 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();
}
}

最佳答案

我的预感是您看到的行为反射(reflect)了操作系统缓存文件。我可以想象,如果您颠倒调用顺序,您会看到类似的速度差异,只是调换了位置。

您可以通过执行一些预热运行或在测试每个文件之前使用 File.Copy 将输入文件复制到临时文件来改进此基准测试。这样文件就不会“热”,您将得到一个公平的比较。

关于c# - IEnumerable 在底层与 IObservable 有何不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741661/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com