XmlReader(Stream(fileName) -> MemoryStream) 比 XmlReader(fileName) 慢
XmlReader(Stream(fileName) -> MemoryStream) slower than XmlReader(fileName)
请原谅我的英语不好
我想阅读大型 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 文件的路径名称。
与reader一起工作:两种算法相同。
我的 RAM 速度是:15GB/秒
我的 ssd 的速度是:150MB/秒
我认为第一个算法至少会快 100 倍。但实际上,第二种算法更快。
第一个算法持续时间:10500 毫秒。
第二种算法持续时间:9500 毫秒。
为什么?是不是因为第一个算法程序要跨越几个抽象层?
感谢您提供任何信息。
XmlReader
是一个只向前的 reader,所以使用 MemoryStream
方法你将通过整个文件恰好两次。
即使第二个 运行 直接来自内存,您在预缓冲时已经有 "disk" 惩罚,因此开销只是再次 运行ning 遍历所有数据。
请原谅我的英语不好
我想阅读大型 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 文件的路径名称。
与reader一起工作:两种算法相同。
我的 RAM 速度是:15GB/秒 我的 ssd 的速度是:150MB/秒
我认为第一个算法至少会快 100 倍。但实际上,第二种算法更快。
第一个算法持续时间:10500 毫秒。
第二种算法持续时间:9500 毫秒。
为什么?是不是因为第一个算法程序要跨越几个抽象层?
感谢您提供任何信息。
XmlReader
是一个只向前的 reader,所以使用 MemoryStream
方法你将通过整个文件恰好两次。
即使第二个 运行 直接来自内存,您在预缓冲时已经有 "disk" 惩罚,因此开销只是再次 运行ning 遍历所有数据。