快速文本阅读(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 还是第三方库)。欢迎所有建议。

快速文本阅读(File.ReadAllText() 和/或 StreamReader.ReadToEnd()的替代品)

您列出的所有变体的瓶颈将是 I/O。任何将完整文件从磁盘读取到内存的方法都会遇到相同的瓶颈。

因此,可以合理地得出结论,没有任何替代办法会产生重大收益。当然,您会发现这些方法与其他方法之间的性能略有不同。但你永远不会看到数量级的收益。

我找到了这篇文章的主题,可能对你来说很有趣。

文章指出:

  • 将每一行读入字符串(缓冲或未缓冲)几乎总是比一次读取整个文本快,并且几乎总是比使用字符串生成器快。

  • 很多人说,使用BufferedReader永远是最快的方法,根据他的测试,这有点错误。我在使用 BufferedReader 方面也有很好的经验,但这只是一种感觉,他的测试表明这并不总是最快的方法,有关更多信息请查看文章。

您将在本文中找到 9 种不同阅读文本文件技术的示例代码和测试结果,即使这没有向您展示"最快的方法",它也可能对您有趣且有帮助。

File.ReadAllLines()

提供更快的性能,但这取决于计算机配置和文件大小。请参阅链接以获取良好的比较 http://cc.davelozinski.com/c-sharp/fastest-way-to-read-text-files