我正在使用ReadFileEx(使用CreateFile和FILE_FLAG_NO_BUFFERING标志打开)从文件中读取扇区对齐的块,记录调用前的开始时间和完成例程中的结束时间(来自QueryPerformanceCounter的时间)。我可以准确地重叠ReadFileEx操作吗?
无论整个文件的大小如何,我的块读取的大小都是恒定的。块偏移按顺序排队,因此ReadFileEx总是读取文件中比上一个更远的点。我注意到一些奇怪的行为,例如较小的文件记录的块读取时间比较大的文件快得多。
在这种情况下,较大文件的大小是较小文件的两倍 - 我不应该认为这在原始数据读取级别上很重要,因为我正在读取相同大小的块。我看到的是文件报告160mb/s的较小文件,报告110mb/s的较大文件。
我仍然在假设它是我的代码中的其他内容导致问题。我也希望ReadFileEx + GetLastError返回ERROR_IO_PENDING后,读操作开始于某个操作系统定义点。
编辑:我的定时不准确性已通过调整我的读取线程进一步确认,因此有更多时间在completionHandler通知的可警告状态中等待。这增加了报告的读取速度,表明我的问题的一部分是完成处理程序不会在读取完成后立即调用(因此我的结束时间比应该晚)。但是,这样做会大大提高报告的速度,同时为更小或更小的文件提高比例。
TL; DR我的问题是,我可以用来衡量读操作的实际时间,而不是和完成例程调用ReadFileEx(这可能无法启动读直线距离)之间的时间?
只是澄清一下,你是否在不等待完成的情况下进行多个'ReadFileEx'调用,或者你是否为每次完成都调用一次'ReadFileEx'调用?据我所知,没有简单的方法来计时实际阅读。 – 2011-06-14 11:38:47
@dauphic我正在做多个ReadFileEx调用,每次调用完成处理程序在未来的某个时刻完成读取。 – badgerr 2011-06-14 11:53:47
我不是100%,但我相信操作系统可能决定同时进行多个读取。这可能会损坏大文件的读取。我的经验是,重叠读取仅用于与处理最后一次读取并行执行下一次读取,而不是排队多次读取。 – 2011-06-14 12:03:58