Будет ли поиск обратно в предыдущее местоположение быстрее, чем поиск нового?

Если у меня есть код C

off_t off = ftello(f);
fseeko(f, some_location); 
// do some work
fseeko(off);

Является ли второй fseeko медленным, как первый? Я думал, что блоки файлов всегда кэшируются, поэтому второй может быть намного быстрее.

В моих результатах профилирования для Linux второй fseek требует аналогичных затрат. Это ожидается?

2 ответа

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

Для записи измерение времени еще сложнее, потому что записанные блоки не обязательно фиксируются немедленно в постоянном хранилище; write системный вызов возвращается, как только данные были скопированы в буферный кеш.

Является ли второй fseeko медленным, как первый?

Может быть.

Вы видите, что говорите о кэшировании, но только в тех случаях, когда вы имеете дело с кратными размерами блока FS.

Я бы посоветовал прочитать больше в Как fseek () реализован в файловой системе?, поскольку "функция fseeko () идентична функции fseek(3)(см. fseek(3)) соответственно, за исключением аргумента смещения функции fseeko().", как предполагает ссылка.

Другие вопросы по тегам