Заставить fgets выдавать больше вызовов read () в linux - PullRequest
5 голосов
/ 31 августа 2010

Я читаю довольно большие строки (до 128 КБ) текста, используя fgets.Я вижу чрезмерное переключение контекста на сервере, используя strace Я вижу следующее:

read(3, "9005 10218 00840023102015 201008"..., 4096) = 4096

т.е. fgets читает куски по 4096 байт за раз.Есть ли способ контролировать, как большие блоки используются fgets при вызове read()?

Ответы [ 2 ]

7 голосов
/ 31 августа 2010

setvbuf было бы очевидным местом для начала.

2 голосов
/ 01 сентября 2010

Функция fgets() является частью пакета stdio, и поэтому она должна буферизовать (или нет) входной поток способом, который согласуется также с использованием fgetc(), fscanf(), fread() и т. Д. вперед. Это означает, что сам буфер (если поток буферизован) является свойством объекта FILE.

Имеется ли буфер или нет, и, если он буферизован, размер буфера можно подсказать библиотеке, вызвав setvbuf().

Реализация библиотеки имеет достаточное количество широты, чтобы игнорировать подсказки и делать то, что она думает лучше всего, но обычно принимаются буферы, которые имеют «разумные» степени двух. Вы заметили, что по умолчанию было 4096, что явно меньше оптимального.

Поток буферизируется по умолчанию, если он открыт в реальном файле. Его буферизация на канале, FIFO, TTY или чем-то еще может иметь другие значения по умолчанию.

...