c++ - 如果并行执行,磁盘文件操作是否更快?

标签 c++ multithreading performance winapi hard-drive

考虑有 N 个文件要完全写入磁盘(即从所有文件缓冲区中刷新)。对于每个文件,我们写入少量(相对于 HDD 寻道时间)数据,例如64KB,使用WriteFile,然后对该文件调用FlushFileBuffers,确保文件的数据完全刷新到硬盘。

如果我们按顺序一个接一个地写入和刷新文件,那么我预计大约需要时间 N*seekTime + N*writeTime,其中 seekTime 是将硬盘磁头定位到正确扇区的时间(这可能需要整个磁盘旋转的时间),而 writeTime 是磁盘顺序写入 64KB 的时间数据。使用这种一对一的方法,我们没有为操作系统提供优化空间,因为我们定义了必须刷新文件的顺序。

在操作系统的一些支持下,可以通过重新排列文件写入和刷新的顺序来实现性能改进,以便考虑到磁盘旋转(即磁头在磁盘上的当前位置)文件操作被重新排列以便从那些开始几乎不需要旋转的(即最接近磁头当前位置的)和以需要几乎完全旋转磁盘的那些结束。

问题是:操作系统(尤其是 Windows)是否提供这种优化?换句话说,是否可以通过在 N 个线程中并行运行文件写入和刷新操作来提高性能,一个线程一个文件?还是会导致额外的重新定位操作降低性能(作为硬盘驱动器的一种上下文切换)?

最佳答案

您应该首先问问自己,并在此解释为什么需要冲洗。您想要实现的不一定是实际发生的。

如果您真的想以在物理设备上产生特定访问模式的方式优化应用程序,那么您可以使您的解决方案非常依赖于硬件。对您的测试用例进行的优化可能在另一种情况下会产生相反的效果。例如,文件碎片怎么办? raid 磁盘呢?网络文件系统呢? SSD 驱动器怎么样?同一台机器上运行的其他进程对同一磁盘的并发访问怎么样?

快速访问磁盘的关键是缓冲。如果您不是绝对需要打败它,请不要打败它。

关于c++ - 如果并行执行,磁盘文件操作是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31428516/

相关文章:

c++ - C++ 中的引用和指针类型转换

c++ - 手动驱动非阻塞原生句柄的最基本的 Asio 执行上下文是什么?

c# - 是否有可能知道哪个线程先完成?

javascript - Android 性能在高于 2.3.5 (phonegap/cordova) 的更高版本上受到影响

python - 在 python 中,如何从字典中检索键?

c++ - std::reference_wrapper 的大小有任何保证吗?

c++ - 从文件中读取类对象c++

java - 不使用 Synchronized 的安全线程队列

c# - 什么在我的应用程序中创建新线程?

performance - 防止R中的性能下降