Почему буферы не очищаются автоматически по умолчанию? - PullRequest
3 голосов
/ 13 сентября 2011

У меня недавно была привилегия установить $| = 1; в моем скрипте Perl, чтобы помочь ему быстрее общаться с другим приложением через канал.

Мне интересно, почему это не настройка по умолчанию. Другими словами, что я теряю, если мой буфер сразу же очищается?

Ответы [ 3 ]

13 голосов
/ 13 сентября 2011

Запись в дескриптор файла выполняется с помощью системных вызовов, а системные вызовы выполняются медленно.

Буферизация потока и его очистка только после записи некоторого количества данных - это способ сохранить некоторые системные вызовы.

8 голосов
/ 13 сентября 2011

Оцените его, и вы поймете.

Буферизация зависит от типа устройства дескриптора вывода: ttys являются линейным буферизацией; трубы и розетки забуференные; диски имеют блочную буферизацию.

Это просто базовое программирование. Это не Perl.

3 голосов
/ 13 сентября 2011

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

В чисто сетевом приложении, управляемом вводом-выводом, это, очевидно, имеет больше смысла.Однако в наиболее распространенных случаях использования буферизованный ввод-вывод (по умолчанию для TTY по умолчанию используется Perl) позволяет программе реже очищать буфер и тратить больше времени на работу процессора.Средний пользователь не заметил бы разницы в терминале или в файле.

...