Re: fprintf && write
- From
- Valentin Nechayev ()
- To
- Boris Rudakov ()
- Date
- 2003-06-04T12:24:22Z
- Area
- CARBON.COPY
* Forwarded from area 'RU.UNIX.PROG'
From: netch@segfault.kiev.ua (Valentin Nechayev)
>>> Boris Rudakov wrote:
AM>> fprintf(out, "%s", buffer);
BR> Не вижу ни малейшего смысла в подобных конструкциях. Кишки xrintfxxx заняты
BR> тем, что интерпретируют единственный "%s" и тупо перекачивают buffer в out.
BR> Накладные расходы в этой и подобных конструкциях несущественны, но... Зачем они
BR> когда можно и без них ?
Можно. Главное - не подставить неизвестную строку в формат в fprintf. Лучше -
fputs().
Кстати, gcc3, например, в hosted режиме переведёт это в fputs() сам.
BR> Я в таких случаях пишу данные непосредственно туду куда нужно, избегая лишних
BR> переписываний во внутренних буфферах.
BR>
BR> Чен'ть типа write(out, .....);
write() - только в том случае если stdio буфер был перед этим успешно
сброшен (fflush()). Иначе начнётся каша между буферами.
BR> 1. write - синхронный блокирующий вызов (или я не прав ?). Но, как бы то ни
BR> было, ты скармливаешь ему весь буффер. Если бы он у тебя выводил не весь
BR> буффер, а часть - ты бы давно уже заметил что твой код неправилен и поправил бы
BR> приращение буфера и декремент длины. Значит - write у тебя пишет все одним
BR> махом. Значит - глюк не в нем.
Логично. ;)
Кстати - 2All - вот отличный пример логики в поиске ошибок.
BR> Моя теория такова (еще раз шаркну ножкой что я не юниксоид, но основные
BR> принципы едины):
BR>
BR> * Твой код делает два системных вызова.
BR>
BR> * Твой код выводит все за одну итерацию (иначе ты бы уже заметил ошибки в нем).
BR> Итого - ты делаешь ровно один select и ровно один write.
BR>
BR> * "Меня терзают смутные сомнения" что fprintf же делает только один - синхроный
BR> блокирующий write. И делает только один write (правда х.з. что он делает при
BR> переполнении внутренних буфферов при форматировании строки - может быть он
BR> делает серию write по мере их заполнения; однако, думаю что в твоем случае ему
BR> там хватает одного write).
Скорее всего, только один. И то - не всегда. Стандартная буферизация идёт
кусками, кажется, по 4K. Вряд ли все строки столь длинные.
BR> * Так же меня "терзают смутные сомнения" что select - дорогой вызов, дороже
BR> write.
Если номер дескриптора не сильно велик, то select действительно не должен
быть дороже write().
BR> Таким образом, сдается мне что двукратное замедление вызвано тем, что ты в два
BR> раза чаще беспокоишь ядро системы :)
-netch-
--- ifmail v.2.15dev5
* Origin: Dark side of the coredump (2:5020/400)