Подтвердить что ты не робот

Должны ли программисты на C++ часто использовать std:: flush?

Рекомендуется ли, чтобы программисты на C++ часто пишут строки типа

std::cout << "output: " << i << " and " << j << std::flush;
//more
std::cout << "ending newline." << std::endl; //endl does flush

Другими словами, в выходных строках, которые не имеют endl, мы должны быть flush in alot, на всякий случай? Или это больше не нужно больше в эти дни на большинстве платформ?

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

Промывка, как правило, не самая большая привычка проникать, поскольку покраснение может замедлять вашу программу время от времени, если вы постоянно пишете в IO. Вы можете управлять тем, как вы выполняете скрытый ввод с помощью std::endl или std::flush (при std::endl просто вставляете \n в поток, а затем вызываете flush).

@StackedCrooked в C + + Lounge собрал эксперимент о стоимости очистки и вообще не промывать: http://coliru.stacked-crooked.com/view?id=55c830cf9a144559f31963de41fa9405-f674c1a6d04c632b71a62362c0ccfc51

Неплохая промывка относительно хорошо после многократного использования, в то время как промывка добавляет немного накладных расходов каждый раз, когда вы вызываете ее: вы честно лучше не вручную std::flush - ваши потоки. Просто делайте это один раз в конце программы или после окончания критического раздела кода.

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

EDIT: Соответствующая аналогия: Проще говоря, в чем цель flush() в ostream