С++ делает ли печать на терминале значительно замедляющим код?

У меня есть код, в котором я в настоящее время печатаю много диагностических сообщений на терминал. Кто-нибудь знает, насколько это замедляет мой код? Будет ли я получать большое увеличение скорости, связывая вывод с файлом, например? вместо запуска:

./my_program

i запустите

./my_program > output.log

Кроме того, будет ли я получать дальнейшее увеличение скорости за счет замены cout на поток и запись в файл напрямую?

EDIT: допустим, что я пишу /dev/shm, скорость доступа к диску не является проблемой.

Ответ 1

Да, отрисовка на экран занимает больше времени, чем запись в файл.
В Windows это еще медленнее, так как рендеринг программ не является программой, которая работает, поэтому между процессами постоянно отправляются сообщения, чтобы получить их. Я предполагаю, что это то же самое в Linux, поскольку виртуальный терминал находится в другом процессе, чем тот, который работает.

Ответ 2

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

Ответ 3

Сколько бы скорости, которую вы получили, будет зависеть от нескольких факторов. Консоль Windows, например, заведомо медленна. ofstream может быть слабее быстрее, чем cout, в зависимости от реализации yor libС++ (разные размеры буфера, синхронизация потоков,...)

Ответ 4

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

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

Ответ 5

Это зависит от того, сколько вы печатаете.

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

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

Я очень сомневаюсь, что существует значительная разница в производительности для cout vs. ofstream для производительности терминальной печати или даже вывода в файл. Может быть очень небольшое увеличение производительности, если вы написали строки журнала, используя fwrite. В конечном итоге такие вещи, как cout, вызовут fwrite, поэтому вы можете получить небольшое улучшение, просто позвонив на этот самый низкий уровень самостоятельно.

Наконец - выходные потоки, такие как cout, быстрее, чем потоки ошибок, такие как cerr. Cout будет делать больше буферизации, чем cerr, производительность может быть значительно быстрее. Но похоже, что вы уже используете cout.

Ответ 6

Как правило, да. Если вам не нужно писать на терминал, вы можете использовать файл. Вы также можете использовать /dev/null, если нет необходимости видеть результат (например, для измерения реальной скорости...)