为什么在读取文件大小时文件IO速度会发生变化

Why do file IO speeds change when reading file size?

本文关键字:文件 变化 速度 小时 读取 为什么 IO      更新时间:2023-10-16

我正在Windows 10上用C++创建一个内存分析程序,该程序使用7200rpm硬盘驱动器,基本上扫描您的驱动器,并报告哪些文件夹使用了多少空间,使您能够了解驱动器的大部分存储空间在哪里使用。

出于效率的原因,我使用C++,我的方法是递归地扫描整个驱动器,然后在另一个线程中读取每个文件的大小,这样我就可以同时扫描和分析大小。出于显而易见的原因,扫描比报告大小快得多,但我注意到IO速度跳了很多。有时它会读取5000个文件/秒的大小,而有时它会每秒读取10个文件。请查看此链接中的视频。第一个数字是读取了多少文件的大小,第二个数字是总共找到了多少文件。第一个数字在这里很重要。

为什么我的文件IO速度会改变,对此我能做些什么吗?

在处理器端和硬盘驱动器端都有许多瓶颈需要考虑。

定位数据

从本质上讲,硬盘驱动器必须定位文件中包含数据的扇区和磁道。如果你真的很幸运,数据将在顺序磁道上的顺序扇区中,从而导致很少的磁头移动或重新定位。然而,文件数据可以是";分散";,因此,硬盘驱动器将尽可能多地读取数据,然后计算数据的下一个位置,将磁头重新定位到该位置并继续读取。这会影响数据流。如果您的驱动器是智能的,并且有很多缓存,那么驱动器可以将这些数据放入缓存,并从缓存而不是驱动器中传递数据,这可能会弥补由于重新定位而损失的纳秒。

数据总线

数据必须进入电脑的内存。通常数据只有一条总线。该总线在系统中的许多实体、处理器和硬盘驱动器控制器之间共享。如果你幸运的话,你的电脑有一个用于硬盘的直接内存访问(DMA(控制器。控制器可以绕过处理器将数据从硬盘驱动器端口传输到内存。但是,DMA控制器必须与处理器(和朋友(共享数据总线。总线仲裁是另一个减速和不一致。

共享驱动器

许多操作系统将硬盘驱动器用作虚拟内存;交换内存块。这些文件请求需要与来自程序的请求混合在一起。

顺序访问

大多数较便宜的平台都可以按顺序访问驱动器。只有一个实体可以同时读取。大多数驱动器都是单个位流。更高性能的自定义平台实际上有多个驱动器并行运行。由于设备的顺序性,实体必须等待另一个完成或混合事务。与并行访问(同时读取8位或更多位(的存储器相比。

中断&日程安排

你的电脑里有很多活动,从互联网或wifi通信到音频和视频回放(以及其他正在运行的系统任务(。这些都需要运行。不管你有多少核心,都不够。大多数操作系统将按时间和优先级运行任务。在任务完成之前,很少有一个任务拥有处理器的独占所有权。您的任务将与其他正在运行的任务混合在一起。这样就减慢了你的程序。

Chunking It

大多数磁盘清理实用程序都是以文件块或碎片的形式工作的。速度不如数据操作的质量重要。例如,文件中较小的块比较大的块在移动或复制方面更成功。程序可以被中断(例如,来自用户(。较小的数据块可以更容易地从中断中恢复。

您的程序执行缓慢或时间不一致的原因可能更多,但以上信息应该会让您更好地了解PC的行为。