1 определенно правильно. Операционная система может извлекать данные с диска в кэш, пока ваш код обрабатывает уже полученные данные. Да, диск все еще может быть узким местом - но вам не придется читать, обрабатывать, читать, обрабатывать, читать, обрабатывать, но читать + обрабатывать, читать + обрабатывать, читать + обрабатывать. Например, предположим, что у нас есть обработка, которая занимает половину времени чтения. Представляя время перехода вниз по странице, мы могли бы выполнять такие действия без предварительной выборки:
Read
Read
Process
Read
Read
Process
Read
Read
Process
Принимая во внимание, что с предварительной загрузкой, это оптимизировано для:
Read
Read
Read Process
Read
Read Process
Read
Process
По сути, общее время будет «время чтения всего файла + время обработки последнего фрагмента данных» вместо «время чтения всего файла + время обработки всего файла».
Тестировать это сложно - вам понадобится операционная система, в которой вы можете настроить или отключить кэш. Другой альтернативой является изменение способа открытия файла - например, в .NET, если вы открываете файл с помощью FileOptions.SequentialScan , кеш с большей вероятностью будет делать правильные вещи. Попробуйте с и без этой опции.
Это в основном говорит о предварительной загрузке - общее кэширование (сохранение данных даже после их доставки в приложение) - это другой вопрос, и, очевидно, это большой выигрыш, если вы хотите использовать одни и те же данные более одного раза. Есть также «что-то среднее», когда приложение запросило только небольшой объем данных, но диск прочитал целый блок - ОС не выполняет активную предварительную выборку блоков, которые не были запрошены, но может кэшировать весь блок, так что если приложение затем запрашивает больше данных из того же блока, оно может вернуть эти данные из кэша.