Я сделал программу, которая считывала символы в файле много раз в цикле. Если меня не волнует использование памяти, хранит ли все символы файла в массиве быстрее, чем доступ к символам с помощью fgetc?

Spooky

Ответов: 2

Ответы (2)

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

Например, диск на порядки медленнее, чем основная память.

И даже если ваша ОС (или libc) кэширует данные в ОЗУ, fgetc по-прежнему выполняет системный вызов для их получения, что, вероятно, намного медленнее, чем простое чтение из памяти.

Также из-за относительной медленности системных вызовов используйте fread вместо fgetc для чтения блока байтов за один вызов.

Я думаю, вам следует хотя бы использовать какую-то форму буферизации и не читать символы за раз для заполнения буфера или массива.

Лучше использовать fread () для заполнения буфера / массива, или вы можете даже изучить отображение памяти (mmap), чтобы избежать копирования данных из дискового кеша в режиме ядра. в буфер в пользовательском режиме, если вы хотите немного повысить производительность (так как ваш вопрос тоже помечен как performance). Хотя для одного прохода чтения ваш жесткий диск, безусловно, окажется в затруднительном положении.

Если вам нужно прочитать данные только один раз, возможно, вам подойдет fread () с буфером (ами).

2022 WebDevInsider