基于read/write速度和硬盘缓冲区大小的硬盘访问+搜索时间计算算法
HDD access + search time calculation algorithm based on read/write speed and HDD buffer size
我想编写应用程序,通过执行基准测试来计算平均(访问 + 搜索)HDD 时间。我知道如何测试从 HDD 到内存的文件 read/wite 速度,我可以在制造商页面上查看 HDD 的内部缓冲区大小。测试将在碎片整理分区上进行,所以我认为结果与实际值的近似值不错。如果读取速度等于写入速度那么我可以做到
average_value = (copy_time - (file_size / read_speed * 2)) / (file_size / HDD_buffer_size * 2)
但读取速度通常不同于写入速度,因此此公式不适用。
请有人回答那个公式应该是什么。
试试这个:
double read_time = file_size / read_speed ;
double write_time = file_size / write_speed ;
double total_time_if_no_delays = read_time + write_time ;
double avg_value = (copy_time - total_time_if_no_delays) / (file_size / HDD_buffer_size * 2) ;
首先,我会使用扇区访问而不是文件访问,以避免 FAT 和碎片影响基准测试。扇区访问取决于平台。
但是您可以使用的任何文件访问例程都应该可以工作,只需将文件名更改为 "\\.\A:"
或 \\.\PhysicalDrive0
。要访问软盘和 USB 密钥等可移除媒体,请使用 "\\.\A:"
,但对于硬盘驱动器,请使用 \\.\PhysicalDrive0
,因为第一种方法对它们不起作用。同时将驱动器号 A
或 HDD 编号 0
更改为您需要的任何内容...
在 Window 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.
所有扇区的文件
注意你不应该覆盖文件系统!!!所以如果你正在写不要忘记恢复原始扇区。同样更安全的是避免对第一个扇区进行写访问(通常存储 Boot 和 FAT),因此如果出现错误或关机,您不会丢失 FS.
上面的代码读取 HDD0 的引导扇区(如果可访问)并将其保存到文件。
如果你没有 VCL 使用 winapi C++ sector access example 或 OS API 你任您支配。
对于 HDD 缓冲区 estimation/measurement 我会使用这个:
- Cache size estimation on your system?
因为它是同一件事,只是访问磁盘而不是内存传输。
我会使用 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 几何形状(每个磁道的扇区),那么您可以更精确地测量速率,因为您可以添加寻道时间轨道与方程之间...
我想编写应用程序,通过执行基准测试来计算平均(访问 + 搜索)HDD 时间。我知道如何测试从 HDD 到内存的文件 read/wite 速度,我可以在制造商页面上查看 HDD 的内部缓冲区大小。测试将在碎片整理分区上进行,所以我认为结果与实际值的近似值不错。如果读取速度等于写入速度那么我可以做到
average_value = (copy_time - (file_size / read_speed * 2)) / (file_size / HDD_buffer_size * 2)
但读取速度通常不同于写入速度,因此此公式不适用。
请有人回答那个公式应该是什么。
试试这个:
double read_time = file_size / read_speed ;
double write_time = file_size / write_speed ;
double total_time_if_no_delays = read_time + write_time ;
double avg_value = (copy_time - total_time_if_no_delays) / (file_size / HDD_buffer_size * 2) ;
首先,我会使用扇区访问而不是文件访问,以避免 FAT 和碎片影响基准测试。扇区访问取决于平台。
但是您可以使用的任何文件访问例程都应该可以工作,只需将文件名更改为 "\\.\A:"
或 \\.\PhysicalDrive0
。要访问软盘和 USB 密钥等可移除媒体,请使用 "\\.\A:"
,但对于硬盘驱动器,请使用 \\.\PhysicalDrive0
,因为第一种方法对它们不起作用。同时将驱动器号 A
或 HDD 编号 0
更改为您需要的任何内容...
在 Window 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.
所有扇区的文件注意你不应该覆盖文件系统!!!所以如果你正在写不要忘记恢复原始扇区。同样更安全的是避免对第一个扇区进行写访问(通常存储 Boot 和 FAT),因此如果出现错误或关机,您不会丢失 FS.
上面的代码读取 HDD0 的引导扇区(如果可访问)并将其保存到文件。
如果你没有 VCL 使用 winapi C++ sector access example 或 OS API 你任您支配。
对于 HDD 缓冲区 estimation/measurement 我会使用这个:
- Cache size estimation on your system?
因为它是同一件事,只是访问磁盘而不是内存传输。
我会使用 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 几何形状(每个磁道的扇区),那么您可以更精确地测量速率,因为您可以添加寻道时间轨道与方程之间...