为什么在读取文件大小时文件IO速度会发生变化
Why do file IO speeds change when reading file size?
我正在Windows 10上用C++创建一个内存分析程序,该程序使用7200rpm硬盘驱动器,基本上扫描您的驱动器,并报告哪些文件夹使用了多少空间,使您能够了解驱动器的大部分存储空间在哪里使用。
出于效率的原因,我使用C++,我的方法是递归地扫描整个驱动器,然后在另一个线程中读取每个文件的大小,这样我就可以同时扫描和分析大小。出于显而易见的原因,扫描比报告大小快得多,但我注意到IO速度跳了很多。有时它会读取5000个文件/秒的大小,而有时它会每秒读取10个文件。请查看此链接中的视频。第一个数字是读取了多少文件的大小,第二个数字是总共找到了多少文件。第一个数字在这里很重要。
为什么我的文件IO速度会改变,对此我能做些什么吗?
在处理器端和硬盘驱动器端都有许多瓶颈需要考虑。
定位数据
从本质上讲,硬盘驱动器必须定位文件中包含数据的扇区和磁道。如果你真的很幸运,数据将在顺序磁道上的顺序扇区中,从而导致很少的磁头移动或重新定位。然而,文件数据可以是";分散";,因此,硬盘驱动器将尽可能多地读取数据,然后计算数据的下一个位置,将磁头重新定位到该位置并继续读取。这会影响数据流。如果您的驱动器是智能的,并且有很多缓存,那么驱动器可以将这些数据放入缓存,并从缓存而不是驱动器中传递数据,这可能会弥补由于重新定位而损失的纳秒。
数据总线
数据必须进入电脑的内存。通常数据只有一条总线。该总线在系统中的许多实体、处理器和硬盘驱动器控制器之间共享。如果你幸运的话,你的电脑有一个用于硬盘的直接内存访问(DMA(控制器。控制器可以绕过处理器将数据从硬盘驱动器端口传输到内存。但是,DMA控制器必须与处理器(和朋友(共享数据总线。总线仲裁是另一个减速和不一致。
共享驱动器
许多操作系统将硬盘驱动器用作虚拟内存;交换内存块。这些文件请求需要与来自程序的请求混合在一起。
顺序访问
大多数较便宜的平台都可以按顺序访问驱动器。只有一个实体可以同时读取。大多数驱动器都是单个位流。更高性能的自定义平台实际上有多个驱动器并行运行。由于设备的顺序性,实体必须等待另一个完成或混合事务。与并行访问(同时读取8位或更多位(的存储器相比。
中断&日程安排
你的电脑里有很多活动,从互联网或wifi通信到音频和视频回放(以及其他正在运行的系统任务(。这些都需要运行。不管你有多少核心,都不够。大多数操作系统将按时间和优先级运行任务。在任务完成之前,很少有一个任务拥有处理器的独占所有权。您的任务将与其他正在运行的任务混合在一起。这样就减慢了你的程序。
Chunking It
大多数磁盘清理实用程序都是以文件块或碎片的形式工作的。速度不如数据操作的质量重要。例如,文件中较小的块比较大的块在移动或复制方面更成功。程序可以被中断(例如,来自用户(。较小的数据块可以更容易地从中断中恢复。
您的程序执行缓慢或时间不一致的原因可能更多,但以上信息应该会让您更好地了解PC的行为。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- 为什么在读取文件大小时文件IO速度会发生变化
- 当在matlab mex文件中动态链接时,枚举的typeid会发生变化
- 从两个不同的文件获取输入时,输入会发生变化
- 正在读取随时间变化的文件C++
- QT检测目录和子文件夹的变化
- Mmap():如果底层文件发生变化(收缩)会发生什么
- 将内存写入文件缓冲区如何使其发生变化?