【问题标题】:HDD access + search time calculation algorithm based on read/write speed and HDD buffer size基于读/写速度和硬盘缓冲区大小的硬盘访问+搜索时间计算算法
【发布时间】:2018-01-25 14:50:09
【问题描述】:

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

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

但读取速度通常不同于写入速度,因此此公式不适用。

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

【问题讨论】:

  • 好的。我明白,但是我只知道 C++ std 的一部分。请给我一些代码示例,说明如何按扇区读/写硬盘顺序扇区
  • 我为我的设置添加了带有测量值的图像(按照我在回答中描述的方式完成)。

标签: algorithm performance-testing


【解决方案1】:

首先我会使用扇区访问而不是文件来避免 FAT 和碎片影响基准。扇区访问取决于平台。

但是您可以使用的任何文件访问例程都应该可以工作,只需将文件名更改为"\\\\.\\A:"\\\\.\\PhysicalDrive0。要访问软盘和 USB 密钥等删除媒体,请使用"\\\\.\\A:",但对于硬盘驱动器,请使用\\\\.\\PhysicalDrive0,因为第一种方法不适用于这些。还将驱动器号 AHDD 编号 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 exampleOS 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)可以直接测量。

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

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

【讨论】:

    【解决方案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) ;
    

    【讨论】:

      猜你喜欢
      • 2014-11-20
      • 2011-07-27
      • 2021-04-19
      • 2015-10-25
      • 2012-03-27
      • 2013-07-06
      • 1970-01-01
      • 2011-01-04
      • 2013-08-22
      相关资源
      最近更新 更多