2011-06-14 45 views
1

我正在使用ReadFileEx(使用CreateFile和FILE_FLAG_NO_BUFFERING标志打开)从文件中读取扇区对齐的块,记录调用前的开始时间和完成例程中的结束时间(来自QueryPerformanceCounter的时间)。我可以准确地重叠ReadFileEx操作吗?

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

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

我仍然在假设它是我的代码中的其他内容导致问题。我也希望ReadFileEx + GetLastError返回ERROR_IO_PENDING后,读操作开始于某个操作系统定义点。

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

TL; DR我的问题是,我可以用来衡量读操作的实际时间,而不是和完成例程调用ReadFileEx(这可能无法启动读直线距离)之间的时间?

+0

只是澄清一下,你是否在不等待完成的情况下进行多个'ReadFileEx'调用,或者你是否为每次完成都调用一次'ReadFileEx'调用?据我所知,没有简单的方法来计时实际阅读。 – 2011-06-14 11:38:47

+0

@dauphic我正在做多个ReadFileEx调用,每次调用完成处理程序在未来的某个时刻完成读取。 – badgerr 2011-06-14 11:53:47

+0

我不是100%,但我相信操作系统可能决定同时进行多个读取。这可能会损坏大文件的读取。我的经验是,重叠读取仅用于与处理最后一次读取并行执行下一次读取,而不是排队多次读取。 – 2011-06-14 12:03:58

回答

3

TL; DR我的问题是,我可以测量 读操作的实际时间, 而不是时间调用 ReadFileEx(可能无法启动 阅读直线距离),并完成 程序之间?

可能不是用户模式代码。

控制范围之外的变量太多。你不知道可能需要什么寻求(例如,一个文件可能被分割,另一个可能不被分割)。文件映射(文件段到磁盘块)可能已被缓存,也可能未被缓存。即使没有读取缓冲区,仍然存​​在集群,驱动器搜索重新排序,驱动器缓存等。通过异步操作,您还可以使用调度程序进行操作。

使用驱动程序,您可以执行一些精确的测量,但仍需要运行大量实验并计算平均值才能获得统计结果,从而将驱动器内部发生的所有奇怪事情(重试,重新排序,使用备件,板载缓存,区位记录,热重新校准等)。

相关问题