基于读/写速度和HDD缓冲区大小的HDD访问+搜索时间计算算法

时间:2018-01-25 14:50:09

标签: algorithm performance-testing

我想编写应用程序,通过执行基准测试来计算平均(访问+搜索)HDD时间。我知道如何测试从HDD到内存的文件读/写速度,我可以查看制造商页面什么是HDD的内部缓冲区大小。测试将在defragmentet分区上进行,所以我认为结果不是真实值的近似值。如果读取速度等于写入速度,那么我可以做

average_value = (copy_time - (file_size / read_speed * 2)) / (file_size / HDD_buffer_size * 2)

但读取速度通常与写入速度不同,因此本文不适用。

请有人回答这个公式应该是什么。

2 个答案:

答案 0 :(得分:1)

首先,我会使用扇区访问而不是文件来避免 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 缓冲区估算/测量,我会使用:

因为同样的事情而不是内存传输进行光盘访问。

我会使用 winapi 中的QueryPerformanceCounter进行时间测量(应该绰绰有余)。

我认为(但可能是错误的)方程式有点倒退。我会:

  1. 测量读写速度(单独)

    transfer_read_rate = transfer_read_size / transfer_read_time
    transfer_write_rate = transfer_write_size / transfer_write_time
    
  2. 混合展位费率(平均值)

    transfer_avg_rate = (transfer_read_size + transfer_write_size) / (transfer_read_time + transfer_write_time)
    

    可以直接测量(transfer_read_time + transfer_write_time)

  3. 当我将内存基准测试更改为HDD时(只需通过连续扇区读取替换STOSD传输)结果如下所示(对于我的设置):

    HDD read

    您可以通过简单地测量和平均寻找时间到随机位置来添加寻道时间测量...如果您还添加HDD几何(每个轨道的扇区),那么您可以更精确地测量速率,因为您可以在轨道之间添加寻道时间方程式......

答案 1 :(得分:0)

试试这个:

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) ;