首先我会使用扇区访问而不是文件来避免 FAT 和碎片影响基准。扇区访问取决于平台。
但是您可以使用的任何文件访问例程都应该可以工作,只需将文件名更改为"\\\\.\\A:" 或\\\\.\\PhysicalDrive0。要访问软盘和 USB 密钥等删除媒体,请使用"\\\\.\\A:",但对于硬盘驱动器,请使用\\\\.\\PhysicalDrive0,因为第一种方法不适用于这些。还将驱动器号 A 或 HDD 编号 0 更改为您需要的任何内容...
在窗口 VCL C++ 我做这样的事情:
int hnd;
BYTE dat[512];
hnd=FileOpen("\\\\.\\PhysicalDrive0",fmOpenRead);
if (hnd>=0)
{
FileSeek(hnd,0*512,0); // position to sector you want ...
FileRead(hnd,dat,512); // read it
FileClose(hnd);
hnd=FileCreate("bootsector.dat");
if (hnd>=0)
{
FileWrite(hnd,dat,512);
FileClose(hnd);
}
}
它将打开第一个 HDD 驱动器作为设备(这就是文件名如此奇怪的原因)。从编程方面,您可以假设它是包含您的 HDD 的所有扇区的文件。
当心你不应该覆盖文件系统!!!所以如果你正在写不要忘记恢复原始扇区。另外更安全的是避免对第一个扇区(通常存储引导和 FAT)进行写访问,这样在出现错误或关机时,您不会丢失 FS。
上面的代码读取HDD0的引导扇区(如果可访问)并将其保存到文件中。
如果您没有 VCL,请使用 winapi C++ sector access example 或 OS API 您可以随意使用。
对于 HDD 缓冲区估计/测量,我会使用这个:
因为它是同样的事情,而不是内存传输做磁盘访问。
我会使用 winapi 中的QueryPerformanceCounter 进行时间测量(应该绰绰有余)。
您对我认为的方程式有点倒退(但可能是错误的)。我会:
-
测量读取和写入速度(分别)
transfer_read_rate = transfer_read_size / transfer_read_time
transfer_write_rate = transfer_write_size / transfer_write_time
-
混合摊位费(平均)
transfer_avg_rate = (transfer_read_size + transfer_write_size) / (transfer_read_time + transfer_write_time)
其中(transfer_read_time + transfer_write_time)可以直接测量。
当我将内存基准更改为 HDD 时(只需通过连续扇区读取替换 STOSD 传输结果如下所示(对于我的设置):
您可以通过简单地测量随机位置的平均寻道时间来添加寻道时间测量...如果您还添加了 HDD 几何形状(每个磁道的扇区),那么您可以更精确地测量速率,因为您可以在磁道之间添加寻道时间到方程...