C++ 磁盘性能结构&x27;s ReadTime和WriteTime成员

C++ 磁盘性能结构&x27;s ReadTime和WriteTime成员,c++,performance,winapi,performancecounter,C++,Performance,Winapi,Performancecounter,我试图分离结构,但似乎找不到任何合适的文档。有人知道ReadTime和WriteTime成员的意思吗 MSDN声称“完成读/写所需的时间”,但读/写什么?另外,它的度量单位是什么?通常,与所有DeviceIOControl一样,它表示底层驱动程序的含义。从StorageManagerName成员可以推断,有多个驱动程序使用此结构。通常,与所有DeviceIOControl一样,它意味着底层驱动程序的含义。正如您可以从StorageManagerName成员推断的那样,有多个驱动程序使用此结构。更

我试图分离结构,但似乎找不到任何合适的文档。有人知道ReadTime和WriteTime成员的意思吗


MSDN声称“完成读/写所需的时间”,但读/写什么?另外,它的度量单位是什么?

通常,与所有DeviceIOControl一样,它表示底层驱动程序的含义。从
StorageManagerName
成员可以推断,有多个驱动程序使用此结构。

通常,与所有DeviceIOControl一样,它意味着底层驱动程序的含义。正如您可以从
StorageManagerName
成员推断的那样,有多个驱动程序使用此结构。

更新:我不知道,但我现在知道了

我不熟悉DISK_性能,但我熟悉HKEY_性能数据

计数器报告每次读取的平均时间(还有另一个用于写入的计数器)。这个计数器的类型为。您实际获得的数据是读取所花费的总时间和操作总数。获取两个样本并减去这些值,即可获得样本间隔期间的总读取时间和样本间隔期间的总操作数。然后将这两个值除以,得到每次读取的平均时间

时钟频率也会与性能数据一起返回,因此您可以将时间单位转换为秒

假设DISK_性能的工作方式类似,则ReadTime和WriteTime将是所有读写操作所花费的总时间。不幸的是,它使用的时钟频率并不明显,但它最有可能使用的是来自的值。我会尝试一下,看看结果(平均读写时间)是否与perfmon中的值相比较

头文件(winioctl.h)不包含太多有用的信息,但它确实说明IOCTL\u DISK\u性能请求被转发到DISKPERF筛选器驱动程序或SIMBAD筛选器驱动程序(模拟磁盘故障)。这意味着您应该在不同的设备类型中获得一致的结果

更新

所以我做了研究。一些样本数据:

3579000, 42, 801881, 42, 4.46325577
3749000, 79, 839970, 79, 4.46325464
4076000, 66, 913235, 66, 4.463254255
3614000, 77, 809723, 77, 4.463254718
1465000, 28, 328236, 28, 4.46325205
每行都有来自DISK_PERFORMANCE(每秒采样一次)的ReadTime和ReadCount成员的增量,后面是来自HKEY_PERFORMANCE_数据的相应值,后面是第一个ReadTime除以第二个ReadTime

HKEY_性能数据值以QueryPerformanceFrequency为单位,在我的电脑上为2240517Hz。10000000/2240517=4.4633,因此磁盘性能指标似乎以100ns(=10MHz)为单位


重申一下,DISK_PERFORMANCE::ReadTime是以100ns为单位的总读取时间。

更新:我不知道,但我现在知道了

我不熟悉DISK_性能,但我熟悉HKEY_性能数据

计数器报告每次读取的平均时间(还有另一个用于写入的计数器)。这个计数器的类型为。您实际获得的数据是读取所花费的总时间和操作总数。获取两个样本并减去这些值,即可获得样本间隔期间的总读取时间和样本间隔期间的总操作数。然后将这两个值除以,得到每次读取的平均时间

时钟频率也会与性能数据一起返回,因此您可以将时间单位转换为秒

假设DISK_性能的工作方式类似,则ReadTime和WriteTime将是所有读写操作所花费的总时间。不幸的是,它使用的时钟频率并不明显,但它最有可能使用的是来自的值。我会尝试一下,看看结果(平均读写时间)是否与perfmon中的值相比较

头文件(winioctl.h)不包含太多有用的信息,但它确实说明IOCTL\u DISK\u性能请求被转发到DISKPERF筛选器驱动程序或SIMBAD筛选器驱动程序(模拟磁盘故障)。这意味着您应该在不同的设备类型中获得一致的结果

更新

所以我做了研究。一些样本数据:

3579000, 42, 801881, 42, 4.46325577
3749000, 79, 839970, 79, 4.46325464
4076000, 66, 913235, 66, 4.463254255
3614000, 77, 809723, 77, 4.463254718
1465000, 28, 328236, 28, 4.46325205
每行都有来自DISK_PERFORMANCE(每秒采样一次)的ReadTime和ReadCount成员的增量,后面是来自HKEY_PERFORMANCE_数据的相应值,后面是第一个ReadTime除以第二个ReadTime

HKEY_性能数据值以QueryPerformanceFrequency为单位,在我的电脑上为2240517Hz。10000000/2240517=4.4633,因此磁盘性能指标似乎以100ns(=10MHz)为单位


重申一下,DISK_PERFORMANCE::ReadTime是以100ns为单位的总读取时间。

@ahmd0:我不知道您是否看到了我的原始答案,但我已对其进行了更新。非常感谢。抱歉耽搁了。我一直很忙。因此,根据您所说的,我可以确定驱动器的读/写速度,对吗?例如,要找到驱动器的当前读速度,我可以在某个时间间隔(比如500毫秒)内获取磁盘性能结构2次,然后我可以执行:ReadSpeedInBytesPerSecond=(BytesRead-LastBytesRead)*(10000000.0/(ReadTime-LastReadTime));你能证实这一点吗?@ahmd0:我实现了你的公式,我从perfmon和资源监视器中得到了可比较的结果(每样东西大约50MB/秒)。代码是:
double bytespersec=(nextPerf.BytesRead.QuadPart-diskPerf.BytesRead.QuadPart)*(10000000.0/(nextPerf.ReadTime.QuadPart-diskPerf.ReadTime.QuadPart))
@ahmd0:所以我以适度的使用率运行了一个小时(而不是复制一个大文件),读取速度为2MB/s,写入速度为17MB/s。我想写缓存可以像我上面建议的那样解释这一点。@ahmd0:如果你看到我的原始答案,我不知道,但我已经更新了。非常感谢。抱歉耽搁了。我一直很忙。因此,根据您所说的,我可以确定读/写速度