【问题标题】:XmlReader(Stream(fileName) -> MemoryStream) slower than XmlReader(fileName)XmlReader(Stream(fileName) -> MemoryStream) 比 XmlReader(fileName) 慢
【发布时间】:2015-04-06 10:15:10
【问题描述】:

请原谅我的英语不好。

我想读取大型 XML 文件 (> 2GB)。我看了几篇关于它的帖子,并想出使用 XmlReader。

出于测试目的,我创建了一个 500MB 的 XML 并制作了 2 个代码:

第一个:

MemoryStream mem = new MemoryStream();
Stream file = File.OpenRead(ofd.FileName);
file.CopyTo(mem);
mem.Position = 0;
file.Close();
XmlReader reader = XmlReader.Create(mem);
// work with reader

第二个:

XmlReader reader = XmlReader.Create(ofd.FileName);
// work with reader

ofd.FileName : xml文件的路径名。

使用阅读器:在两种算法中是相同的。

我的内存速度是:15GB/秒 我的ssd的速度是:150MB/秒

我认为第一个算法至少会快 100 倍。但实际上,第二种算法更快。

第一个算法持续时间:10500 毫秒。

第二次算法持续时间:9500 毫秒。

为什么?是不是因为程序在第一个算法中要跨越几个抽象层?

感谢您提供任何信息。

【问题讨论】:

  • 您没有显示足够的关于如何进行基准测试的信息。一秒或 10% 的差异很可能是 JITter 预热。执行适当的基准测试,您可能会看到它们的性能相同。
  • 你在第一种情况下测量什么? (是否包括读取文件?)如果它包括读取文件所用的时间,为什么会期望它“至少快 100 倍”?
  • @CodeCaster : var watch = Stopwatch.StartNew();在算法之前和:watch.Stop(); Console.WriteLine(watch.ElapsedMilliseconds);算法后
  • 这将与获取 128kbps mp3 文件并以 320kpbs 重新编码的方式完全相同明显提高声音质量。
  • 我认为它会更快,因为在第一种情况下:我们读取内存中的所有文件并且我们使用内存。而不是第二种情况,我们每次使用 xmlreader 时都访问 xml 文件。

标签: c# performance stream xmlreader memorystream


【解决方案1】:

XmlReader 是一个只进的阅读器,因此使用MemoryStream 方法,您将准确地浏览整个文件两次。

即使第二次运行是直接从内存中进行的,但在预缓冲时您已经受到了“磁盘”损失,因此开销只是再次运行所有数据。

【讨论】:

  • 你说得对,我忘了在第一种情况下,它读取文件两次。复制需要 1500 毫秒。
  • 如果 copyTo 需要 1500 毫秒,则表示“与阅读器一起工作”需要 9000 毫秒。所以它比第二种算法快一点。现在它更有意义了。但它不应该更快吗?
  • @stecker 操作系统非常擅长预缓冲文件数据,但我不知道幕后究竟发生了什么。如果操作系统决定将文件数据保存在内存中,一项测试甚至可能影响另一项测试。
  • 感谢您的回复 :) 我会选择第二种方法,因为我不知道用户是否有足够的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-06
  • 2012-03-02
  • 1970-01-01
  • 2015-11-20
  • 2014-03-20
相关资源
最近更新 更多