Понимание поведения fwrite при буферизации()

Я использую вызов функции fwrite()для записи данных в канал в Linux.

Ранее fwrite()неоднократно вызывался для небольших фрагментов данных (в среднем по 20 байт ), а буферизация была оставлена ​​для fwrite(). strace процесса показал, что за один раз записывается 4096 байт данных.

Оказалось, что этот процесс написания был узким местом в моей программе. Поэтому я решил буферизовать данные в своем коде в блоки по 64 КБ, а затем записывать весь блок за раз, используя fwrite(). Я использовал setvbuf(), чтобы установить указатель FILE *на «Без буферизации».

Повышение производительности оказалось не таким значительным, как я ожидал.

Что еще более важно, вывод straceпоказал, что данные по-прежнему записываются по 4096 байт за раз. Может кто-нибудь объяснить мне это поведение? Если я звоню fwrite()с 64 КБ данных, почему он записывает только 4096 байт за раз?

Есть ли альтернатива fwrite()для записи данных в конвейер с использованием указателя FILE *?

8
задан codeforester 16 February 2017 в 00:36
поделиться