Этот код запускается на моем компьютере примерно за 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;
}
Я бы хотел следующее:
- отключать поток, если
log_level
меньше подробного. - форматировать код без
if
блок. - получить ту же производительность, что и
if
блок. - использовать STL.
Перефразируя вопрос, есть ли способ получить все три?