我有一个小程序,可以在磁盘上读写文件。将其分解为最简单的级别,它从一个文件流读取字节,然后将它们写入另一个文件流。它可以很好地履行职责,但这并不是最快的事情。
我见过其他应用程序可以惊人的速度破坏千兆字节或更多的读/写操作。显然,它们比.NET应用程序更接近金属。
什么是最有效的.NET API,用于与磁盘进行流传输/从磁盘流传输?哪些win32 API可用于(并且值得调用)进行快速磁盘访问?
最佳答案
快速文件I/O与您进行的特定API调用无关,而与您如何设计应用程序以与I/O一起使用有关。
例如,如果要在单个线程上按顺序执行所有I/O操作
您在单个线程的处理循环中正在瓶颈系统的I/O带宽。另一种更复杂的设计是对应用程序进行多线程处理,以最大化吞吐量并避免等待时间。这使系统可以同时利用CPU和I/O Controller 的带宽。一个典型的设计如下所示:
这不是一个易于设计的体系结构,需要大量考虑才能避免创建内存中的锁争用,或避免因并发I/O请求而使系统不堪重负。您还需要提供控制元数据,以便不在线程的调用堆栈上而是在输入/输出工作队列中管理输出处理的状态。您还必须确保以正确的顺序转换和写入输出,因为使用多线程I/O不能确保工作以保证的顺序放在输入队列中。它很复杂-但有可能,并且与串行方法相比,吞吐量可能有巨大差异。
如果您真的有时间并且想从系统中获取每盎司的性能,则还可以使用I/O completion ports(一种相对较低级别的API)来最大化吞吐量。
祝你好运。
关于.net - 在.NET中读写磁盘最快的方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1084927/