накладные расходы std :: cout, если закрыты (STDIN_FILENO)

У меня есть фоновый процесс (демон в системе Unix), которые имеют std::cout для отладки исходного файла в некоторых местах. Я запускаю этого демона в режиме тишины или в режиме без тишины. На silence mode после запуска процесса я выполняю этот бит кода:

std::cout.rdbuf(0);
close(STDIN_FILENO);
close(STDOUT_FILENO);
close(STDERR_FILENO);

И как вы понимаете std::cout все еще присутствует в коде и работает.

На NON silence mode есть большие накладные расходы, в то время как cout на экран очень дорогой и медленный ввод-вывод.

Вопрос:
Какие накладные расходы на код silence mode? Есть ли некоторые «перетаскивание» для моей программы из-за std::cout настоящее время, но с закрытыми STDOUT_FILENO? (время от времени пытайтесь напечатать до 1 килобайта информации)

а насколько велики эти накладные расходы?

1

Решение

Это очевидно имеет некоторые накладные расходы. Но не много; первое в каждом << это проверить, что состояние потока хорошее. И это не должен быть, если соответствующее физическое устройство закрыто. По крайней мере, он испортится после первой очистки (из-за переполнения буфера). Или вы можете позвонить std::cout.rdbuf( nullptr ), который должен сделать это немедленно испортится.

Традиционным решением было создание потокового буфера без операции. Преимущество в том, что поток не идет плохо: чтение просто всегда видит конец файла, а вывод всегда работает. Недостатком является то, что из-за хорошего состояния потока вы фактически форматируете весь вывод: std::cout << someDouble сделает всю работу по преобразованию двойника в последовательность символов. Если состояние потока плохое (как это будет с nullptr в качестве буфера потока), то << операторы возвращаются, прежде чем пытаться что-либо преобразовать.

2

Другие решения


По вопросам рекламы [email protected]