Что является более эффективным fget c против fread? - PullRequest
0 голосов
/ 22 февраля 2020

Я хочу скопировать содержимое одного файла в другой.

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

Но вскоре я понимаю, что многократное использование fgetc() равносильно выполнению нескольких вызовов функций (указатель стека), поэтому в случае больших файлов этот процесс будет занимать больше времени.

Что эффективнее?

size_t _Cdecl fread(void *__ptr, size_t __size, size_t __n, FILE *__stream);

против

int _Cdecl fgetc(FILE *__stream);

1 Ответ

4 голосов
/ 22 февраля 2020

Проблема с fgetc заключается в том, что современные C реализации поддерживают потоков . FILE может совместно использоваться несколькими потоками, поэтому для доступа к буферу потребуется явная блокировка. Хотя вы можете увеличить буфер с помощью setbuf, это не устраняет необходимость в блокировке. Поэтому вызов fread будет почти всегда более производительным, чем несколько вызовов fgetc.

Любая настройка setbuf может повлиять только на производительность. Чтобы читать по одному символу за раз из буферизованного потока, вы можете использовать стандарт POSIX flockfile / funlockfile и getc_unlocked, когда файл заблокирован для вашего потока.

Но даже тогда, fread очень вероятно, более производительный, чем множественные getc_unlocked вызовы, потому что он был оптимизирован для чтения блока .

...