Когда вы выполняете чтение 1024 * 32 КБ, читаете ли вы снова и снова один и тот же блок памяти, или же вы выделяете в общей сложности 32 МБ, а также заполняете все 32 МБ?
Если выВы читаете меньшие операции чтения в том же блоке памяти 32 КБ, тогда разница во времени, вероятно, заключается просто в том, что Windows не нужно очищать дополнительную память.
Обновление на основе FILE_FLAG_NO_BUFFERING
дополнение к вопросу:
Я не уверен на 100%, но я полагаю, что при использовании FILE_FLAG_NO_BUFFERING
Windows заблокирует буфер в физической памяти, что позволит драйверу устройства работать с физическими адресами(например, для прямого доступа к памяти непосредственно в буфер).Он мог (я полагаю) сделать это, разбив большой запрос на меньшие запросы, но я подозреваю, что у Microsoft может быть философия, что «если вы запрашиваете FILE_FLAG_NO_BUFFERING
, тогда мы предполагаем, что вы знаете, что делаете, и мыне встанет у вас на пути ".
Конечно, блокировка 32 МБ одновременно, а не 32 КБ, потребует больше ресурсов.Так что это будет похоже на мое первоначальное предположение, но на уровне физической памяти, а не на уровне виртуальной памяти.
Однако, так как я не работаю на MS и не имею доступа к источнику Windows,Я иду по смутным воспоминаниям о тех временах, когда я работал ближе с ядром Windows и моделью драйвера устройства (так что это более или менее спекуляция).