2013-06-28 2 views
19

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

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

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

+5

станд :: епсИ поведение вызывает поток автоматически. Единственная причина использовать '\ n' - это если вы не хотите сбросить – SheetJS

+21

Только когда они часто посещают ванную комнату. – 0x499602D2

+1

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

ответ

16

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

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

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

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

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

+1

Не думаю, что вам нужно вывести вывод перед ожиданием ввода. По умолчанию они привязаны. –

+0

@MooingDuck Точно. Что касается стандартных потоков C++, нет необходимости флешивать перед запросом ввода: http://en.cppreference.com/w/cpp/io/basic_ios/tie (см., В частности, раздел «Примечания»). – Oberon

+0

@MooingDuck: Я считаю, что это правда только с 'cin' и' cout', которые специально связаны друг с другом. Но другие 'ostream' должны быть явно синхронизированы так или иначе. – wallyk

14

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

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

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

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

EDIT: Соответствующая аналогия: In simple terms, what is the purpose of flush() in ostream

+0

Тем не менее, я почти всегда использую std :: endl. В большинстве случаев немедленная доступность информации пользователю программы перевешивает преимущества производительности при не промывке. – StackedCrooked

+0

@StackedCrooked: На самом деле, судя по номерам, я бы сказал, что один из них слишком много. Снижение производительности меньше, чем я себе представлял. Что это такое, 5,2 мс? –

+0

Да, стоимость составляет около 10 микросекунд или 100 000 флешей в секунду. – StackedCrooked