В C ++, насколько дорого использовать операцию istream :: seekg?
РЕДАКТИРОВАТЬ: Сколько я могу сойти с поиска по файлу и чтения байтов? Как насчет частоты в зависимости от величины смещения?
У меня есть большой файл (4 ГБ), который я анализирую, и я хочу знать, нужно ли пытаться объединить некоторые из моих запросов на поиск. Я бы предположил, что величина различий в расположении файла играет роль — например, если вы ищете больше, чем страница в памяти, это повлияет на производительность — но небольшой поиск не имеет никакого значения. Это правильно?
Этот вопрос сильно зависит от вашей операционной системы и дисковой подсистемы.
Очевидно, что сам поиск займет практически нулевое время, поскольку он просто обновляет смещение. На самом деле чтение вытянет некоторые данные с диска …
…но сколько данных зависит от многих вещей. Ваш диск имеет кеш, который может иметь свой собственный размер блока и может выполнять какое-то упреждающее чтение. Ваш RAID-контроллер (если есть) будет иметь свой собственный кэш, возможно, со своим собственным размером блока и опережающим чтением.
Ваше ядро имеет кеш страниц — по сути, все свободное ОЗУ — и, вероятно, оно также будет выполнять какие-то операции чтения с опережением. В Linux это настраивается, и ядро адаптирует его в зависимости от того, насколько последовательными будут ваши шаблоны доступа, независимо от того, вызвали ли вы posix_fadvise
, так далее.
Все эти кэши означают, что если вы обращаетесь к некоторым данным, а затем к ближайшим данным, есть вероятность, что второй доступ вообще не коснется диска.
Если у вас есть возможность кодирования для последовательного доступа к файлу, это, безусловно, будет быстрее, чем случайное чтение, особенно небольшое случайное чтение. Поиск одного механического диска занимает около 10 мс, так что вы можете сделать здесь математику. (Хотя поиск на твердотельном диске происходит примерно в 100 раз быстрее.)
Большие чтения обычно лучше, чем небольшие … Хотя обработка данных по несколько килобайт за раз может быть быстрее, чем при больших блоках, если это позволяет обработке оставаться в кэше.
Короче говоря, вам нужно будет предоставить гораздо больше информации о вашей системе и вашем приложении, чтобы получить правильный ответ, и даже в этом случае наиболее вероятный ответ — «сравните его».
Других решений пока нет …