Как лучше всего полностью отключить запись в ostream? - PullRequest
0 голосов
/ 26 мая 2020

Этот код запускается на моем компьютере примерно за 5,8 секунды.

for (int i = 0; i < 100; ++i) {
    std::stringstream ss;
    //ss.setstate(std::ios_base::badbit);
    //ss.setstate(std::ios_base::failbit);
    //ss.setstate(std::ios_base::badbit | std::ios_base::failbit);
    //ss.ignore(std::numeric_limits<std::streamsize>::max());
    for (int i = 0; i < 1000*1000; ++i) {
        ss<<"i am groot!"<<std::endl;
    }
}

Когда я удаляю внутренний for l oop, он выполняется примерно за 0,06 секунды.

Когда я включить любую из закомментированных строк, она выполняется примерно за 2,6 секунды.

Есть ли лучший способ отключить запись в поток? Я бы хотел, чтобы время выполнения было ближе к 0,06 секунды.

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

EDIT:

Отредактировано с учетом комментариев.

Этот код иллюстрирует вариант использования подробного ведения журнала.

/* initialization */
std::ostream verbose_log(std::cout.rdbuf);
if (log_level < kVerbose) {
    verbose_log.setstate(std::ios_base::badbit);
}

/* do some work. log it's done. */
/*
this doesn't print anything if log level is less than verbose.
but it seems to do about 40% of the work anyway.
*/
verbose_log<<"some work done. result="<<result1<<std::endl;

/* do more work. log it's done */
/*
this obviously has the desired result.
however, the code is less elegant.
*/
if (log_level >= kVerbose) {
  std::cout<<"more work done. result="<<result2<<std::endl;
}

Я бы хотел следующее:

  1. отключать поток, если log_level меньше подробного.
  2. форматировать код без if блок.
  3. получить ту же производительность, что и if блок.
  4. использовать STL.

Перефразируя вопрос, есть ли способ получить все три?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...