Почему буферы не очищаются автоматически по умолчанию?

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

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

3 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам