快速文本阅读(File.ReadAllText() 和/或 StreamReader.ReadToEnd()的替代品)
本文关键字:StreamReader 替代品 ReadToEnd ReadAllText 文本 File | 更新日期: 2023-09-27 18:33:59
快速阅读问题:我想知道是否还有其他我忽略的技术,也许是p/invoke到某个库(无论是winapi还是第三方库)。欢迎所有建议。
问题的完整背景:对于给定的用例,我需要将文本文件读入内存,然后我可以对其进行操作。问题不在于操作,而在于 I/O。我目前正在使用 C# 使用以下技术:
1) "文件"的 ReadAllText() 方法
var content = File.ReadAllText(file.FullName);
2) "StreamReader"的 ReadToEnd() 方法
var content = String.Empty;
using(var streamReader = File.OpenText(file.FullName)) {
content = streamReader.ReadToEnd();
}
3)我还尝试将BufferedStream
与方法2结合使用
对于 5 到 20MB 之间的文件,它们的性能大致相同。所以,问题来了:我想知道是否会有我忽略的其他技术,也许是 p/invoke 到某个库(无论是 winapi 还是第三方库)。欢迎所有建议。
您列出的所有变体的瓶颈将是 I/O。任何将完整文件从磁盘读取到内存的方法都会遇到相同的瓶颈。
因此,可以合理地得出结论,没有任何替代办法会产生重大收益。当然,您会发现这些方法与其他方法之间的性能略有不同。但你永远不会看到数量级的收益。
我找到了这篇文章的主题,可能对你来说很有趣。
文章指出:
-
将每一行读入字符串(缓冲或未缓冲)几乎总是比一次读取整个文本快,并且几乎总是比使用字符串生成器快。
-
很多人说,使用BufferedReader永远是最快的方法,根据他的测试,这有点错误。我在使用 BufferedReader 方面也有很好的经验,但这只是一种感觉,他的测试表明这并不总是最快的方法,有关更多信息请查看文章。
您将在本文中找到 9 种不同阅读文本文件技术的示例代码和测试结果,即使这没有向您展示"最快的方法",它也可能对您有趣且有帮助。
File.ReadAllLines()
提供更快的性能,但这取决于计算机配置和文件大小。请参阅链接以获取良好的比较 http://cc.davelozinski.com/c-sharp/fastest-way-to-read-text-files