我有一个小程序可以在磁盘上读写文件。将其分解为最简单的级别,它从一个文件流中读取字节并将它们写入另一个文件流。它履行其职责很好,但它不是最快的事情。
我已经看到其他应用程序可以以惊人的速度撕破一千兆字节或更多的读/写。显然,他们的操作更接近金属,而不是一个小的.NET应用程序。
用于流入/流出磁盘的最有效的.NET API是什么?有哪些win32 API可用(并且值得p /调用)以便快速访问磁盘?
答案 0 :(得分:11)
快速文件I / O不是关于您所做的特定API调用,而是关于如何构建应用程序以使用I / O.
如果您以顺序方式在单个线程上执行所有I / O操作,例如
您在单个线程的处理循环中阻碍了系统的I / O带宽。另一种更复杂的设计是多线程应用程序以最大化吞吐量并避免等待时间。这允许系统同时利用CPU和I / O控制器带宽。典型的设计看起来像是:
这不是一个容易设计的简单架构,需要花费大量精力来避免创建内存中的锁争用,或者使用并发I / O请求来压倒系统。您还需要提供控制元数据,以便不在线程的调用堆栈上管理输出处理的状态,而是在输入/输出工作队列中管理。您还必须确保以正确的顺序转换和写入输出,因为对于多线程I / O,您无法确保按保证顺序将工作放在输入队列中。它很复杂 - 但它是可能的,并且它可以在串行方法上产生巨大的吞吐量差异。
如果您真的有时间并希望从系统中挤出每一盎司的性能,您还可以使用I/O completion ports - 相对较低级别的API - 来最大化吞吐量。
祝你好运。答案 1 :(得分:6)
.NET文件支持足够快(与本机Win32功能相当)。有几个选项可以帮助您提高绩效:
答案 2 :(得分:1)
您是否已分析过您的应用程序以确定磁盘I / O是否是瓶颈?
您在运行此类型的硬件是什么类型的?什么是硬件配置?
在.NET中,您可以尝试System.IO.File
命名空间。
对于Win32函数,您可以尝试CreateFile,WriteFile,ReadFile系列。
一个例子:
http://msdn.microsoft.com/en-us/library/bb540534(VS.85).aspx
绝对不会切割和干燥。这都是关于测试和测量的。
答案 3 :(得分:0)
BinaryReader
和BinaryWriter
非常快。如果您正在阅读结构,那么in this article描述的不安全方法会让您快速阅读,写作也类似。我也同意仔细检查I / O是否真的是瓶颈的建议。由于这样的错误,我第一次看到那篇文章。