fopen: хорошая идея оставить открытым или использовать буфер? - PullRequest
1 голос
/ 29 января 2011

Итак, у меня есть много файлов журналов, в которые мне нужно записать. Они создаются при запуске программы и сохраняются в файл при закрытии программы.

Мне было интересно, лучше ли это сделать:

fopen () при запуске программы, затем закройте файлы, когда программа завершится - я просто запишу в файлы при необходимости. Будет ли что-нибудь замедлено (например, другой файл io), если эти файлы все еще будут «открыты»?

OR

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

Ответы [ 6 ]

8 голосов
/ 29 января 2011

Ну, fopen(3) + fwrite(3) + fclose(3) - это буферизованный пакет ввода / вывода, так что еще один слой буферизации поверх него может просто замедлить работу.

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

3 голосов
/ 29 января 2011

Краткий ответ:

  1. Большое количество открытых файлов не должно ничего замедлять
  2. Запись в файл будет буферизована в любом случае

Таким образом, вы можете оставить эти файлы открытыми, но не забудьте проверить лимит открытых файлов в вашей ОС.

1 голос
/ 30 января 2011

Было упомянуто, что FILE *, возвращаемый fopen, уже буферизован.Для ведения журнала вам, вероятно, следует также изучить использование функций setbuf () или setvbuf () для изменения режима буферизации ФАЙЛА *.

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

1 голос
/ 29 января 2011

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

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

1 голос
/ 29 января 2011

Нет веских причин для буферизации сообщений журнала в вашей программе и записи их при выходе.Просто напишите их, как они генерируются, используя fprintf.Система stdio позаботится о буферизации для вас.Конечно, это означает открытие файла (с fopen) с самого начала и сохранение его открытым.

1 голос
/ 29 января 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...