Могу ли я точно перекрыть время операций ReadFileEx? - PullRequest
1 голос
/ 14 июня 2011

Я читаю выровненные по секторам куски из файла, используя ReadFileEx (открывается с помощью CreateFile и флага FILE_FLAG_NO_BUFFERING), записываю время начала до вызова и время окончания в процедуре завершения (времена от QueryPerformanceCounter).

Размер чтения моего чанка постоянен, независимо от размера файла в целом. Смещения чанков ставятся в очередь последовательно, поэтому ReadFileEx всегда читает точку дальше в файле, чем последняя. Я заметил странное поведение, такое, что файл меньшего размера записывает значительно более быстрое время чтения фрагмента, чем файл большего размера.

В этом случае размер файла большего размера вдвое больше размера файла меньшего размера - я не должен ожидать, что это будет иметь значение на уровне чтения необработанных данных, поскольку я читаю фрагменты одинакового размера независимо от этого. То, что я вижу, - это файл меньшего размера, сообщающий о прочтении 160 МБ / с, и файл большего размера, сообщающий о 110 МБ / с.

Я все еще работаю с предположением, что в моем коде что-то другое, что вызывает проблему. Я также ожидаю, что операции чтения начнутся в некоторой точке, определенной операционной системой после того, как ReadFileEx + GetLastError вернет ERROR_IO_PENDING.

edit: Моя неточность синхронизации была дополнительно подтверждена настройкой потока чтения, чтобы у нее было больше времени для ожидания уведомлений завершения в обработчике в состоянии оповещения. Это увеличило сообщаемую скорость чтения, что указывает на то, что часть моей проблемы заключается в том, что обработчик завершения не вызывается сразу после завершения чтения (и поэтому мое время окончания позже, чем должно быть). Тем не менее, это увеличило заявленную скорость пропорционально как для файла большего, так и для меньшего размера.

TL; DR У меня вопрос, могу ли я измерить фактическое время операции чтения, а не время между вызовом ReadFileEx (которое может не сразу начать чтение) и процедура завершения?

1 Ответ

3 голосов
/ 14 июня 2011

TL; DR. Мой вопрос: могу ли я измерить фактическое время операции чтения, а не время между вызовом ReadFileEx (который может не сразу начать чтение) и процедурой завершения?

Вероятно, не из кода пользовательского режима.

Слишком много переменных вне вашего контроля.Вы не знаете, какой поиск может потребоваться (например, один файл может быть фрагментирован, а другой - нет).Карта файлов (сегменты файлов на дисковые блоки) может быть, а может и не кэшироваться.Даже без буферов чтения все еще есть кластеризация, переупорядочение поиска на диске, кэширование на диске и т. Д. С асинхронными операциями у вас также есть планировщик, вступающий в игру.

С драйвером вы можете сделать некоторые точныеизмерений, но вам все равно нужно провести много экспериментов и вычислить средние значения, чтобы получить статистический результат, который учитывает все странные вещи, происходящие внутри накопителя (повторные попытки, изменение порядка, использование резервных копий, встроенное кэширование, бит зоны).запись, тепловая калибровка и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...