gpt4 book ai didi

c++ - 我可以精确地时间重叠 ReadFileEx 操作吗?

转载 作者:可可西里 更新时间:2023-11-01 11:38:02 24 4
gpt4 key购买 nike

我正在使用 ReadFileEx 从文件中读取扇区对齐的 block (使用 CreateFile 和 FILE_FLAG_NO_BUFFERING 标志打开),记录调用前的开始时间和完成例程中的结束时间(来自 QueryPerformanceCounter 的时间)。

无论整个文件的大小如何,我的 block 读取大小都是恒定的。 block 偏移量按顺序排队,因此 ReadFileEx 始终读取文件中比上一个点更远的点。我注意到一些奇怪的行为,例如较小的文件记录的 block 读取时间明显快于较大的文件。

在这种情况下,较大文件的大小是较小文件的两倍 - 我不应该期望这在原始数据读取级别上很重要,因为无论如何我正在读取相同大小的 block 。我看到的是较小的文件报告读取速度为 160mb/s,而较大的文件报告读取速度为 110mb/s。

我仍在假设是我的代码中的其他原因导致了问题。我还希望读取操作在 ReadFileEx + GetLastError 返回 ERROR_IO_PENDING 后在某个操作系统定义的点开始。

编辑:我的计时不准确已通过调整我的读取线程得到进一步确认,因此它有更多时间在可警报状态下等待 completionHandler 通知。这增加了报告的读取速度,表明我的部分问题是完成处理程序不会在读取完成后立即被调用(因此我的结束时间晚于应该的时间)。但是,这样做会按比例增加较大文件和较小文件的报告速度。

TL;DR 我的问题是,我可以测量读取操作的实际时间,而不是调用 ReadFileEx 之间的时间(这可能不会直接开始读取away) 和完成例程?

最佳答案

TL;DR My question is, can I measure the actual time of the read operation, and not the time between calling ReadFileEx (which may not start the read straight away) and the completion routine?

可能不是来自用户模式代码。

你无法控制的变量太多了。你不知道可能需要什么搜索(例如,一个文件可能是碎片化的,另一个可能不是)。文件映射(文件段到磁盘 block )可能已经缓存也可能未缓存。即使没有读取缓冲区,仍然存​​在集群、驱动器上寻道重新排序、驱动器上缓存等。通过异步操作,您还可以使用调度程序。

有了驱动器,您可以进行一些精确的测量,但您仍然需要运行大量实验并计算平均值以获得统计结果,该统计结果会排除驱动器内部发生的所有奇怪事情(重试、重新排序) ,使用备件、机载缓存、区域位记录、热重新校准等)。

关于c++ - 我可以精确地时间重叠 ReadFileEx 操作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341595/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com