Вы хотите небуферизованный вывод всякий раз, когда хотите убедиться, что вывод записан перед продолжением. Одним из примеров является стандартная ошибка в библиотеке времени выполнения C - по умолчанию она обычно не буферизируется. Так как ошибки (надеюсь) нечасты, вы хотите знать о них немедленно. С другой стороны, стандартный вывод буферизуется просто потому, что предполагается, что через него будет проходить гораздо больше данных.
Другим примером является библиотека журналов. Если ваши сообщения журнала хранятся в буферах вашего процесса, а ваш процесс сбрасывает ядро, есть очень хороший шанс, что вывод никогда не будет записан.
Кроме того, минимизируются не только системные вызовы, но и дисковый ввод-вывод. Допустим, программа читает файл по одному байту за раз. При небуферизованном вводе вы будете выходить на (относительно очень медленный) диск для каждого байта, даже если в любом случае он, вероятно, должен прочитать весь блок (у самого оборудования диска могут быть буферы, но вы все равно обращаетесь к контроллеру диска). который будет медленнее, чем доступ в памяти).
При буферизации весь блок считывается в буфер сразу, после чего отдельные байты доставляются вам из (в памяти, невероятно быстрой) области буфера.
Имейте в виду, что буферизация может принимать различные формы, например, в следующем примере:
+-------------------+-------------------+
| Process A | Process B |
+-------------------+-------------------+
| C runtime library | C runtime library | C RTL buffers
+-------------------+-------------------+
| OS caches | Operating system buffers
+---------------------------------------+
| Disk controller hardware cache | Disk hardware buffers
+---------------------------------------+
| Disk |
+---------------------------------------+