使控制台输出是否"verbose"的最快方法

Fastest way to make console output "verbose" or not

本文关键字:方法 verbose 输出 是否 控制台      更新时间:2023-10-16

我正在制作一个小系统,我希望能够在整个系统中切换"详细"文本输出。

我制作了一个名为globals.h的文件:

namespace REBr{
    extern bool console_verbose = false;
}

如果这是真的,我希望我所有的类在构造、破坏、复制或做几乎任何事情时向控制台打印一条消息。

例如:

window(string title="",int width=1280,int height=720):
Width(width),Height(height),title(title)
{
    if(console_verbose){
        std::cout<<"Generating window #"<<this->instanceCounter;
        std::cout<<"-";
    }
    this->window=SDL_CreateWindow(title.c_str(),0,0,width,height,SDL_WINDOW_OPENGL);
    if(console_verbose)
        std::cout<<"-";
    if(this->window)
    {
        this->glcontext = SDL_GL_CreateContext(window);
        if(console_verbose)
            std::cout<<".";
        if(this->glcontext==NULL)
        {
            std::cout<<"FATAL ERROR IN REBr::WINDOW::CONSTR_OPENGLCONTEXT: "<<SDL_GetError()<<std::endl;
        }
    }
    else std::cout<<"FATAL ERROR IN REBr::WINDOW::CONSTR_WINDOW: "<<SDL_GetError()<<std::endl;
    if(console_verbose)
        std::cout<<">done!"<<endl;
}

现在如您所见,我在该构造函数中有很多 if。我真的不希望这样,因为这会减慢我的应用程序速度。我需要在不删除"加载栏"的情况下尽可能快地做到这一点(这有助于我确定程序在哪个功能上停止运行(。

实现此目的的最佳/最快方法是什么?


我的系统中的所有内容都在命名空间 REBr 下

实现这一点的一些变体:

  1. 使用一些记录器库。这是最佳选择,因为它为您提供了最大的灵活性和一些有用的经验;)而且你不必设计什么。例如,看看谷歌GLOG。
  2. 定义一些宏,允许您通过仅更改宏来打开/关闭所有这些日志。但是要正确写出这样的马可并不容易。
  3. 将条件标志标记为 constexpr。这样,您可以切换标志,并且根据其值,编译器将优化编译程序中if。但是if仍然会在代码中,所以它看起来有点笨重。

无论如何,所有这些选项都需要重新编译程序。如果没有重新编译,就不可能达到最大速度。

我经常使用支持调试级别的 Logger 类。 呼叫可能如下所示:

logger->Log(debugLevel, "%s %s %d %d", timestamp, msg, value1, value2);

Logger 类支持多个调试级别,以便我可以微调调试输出。这可以随时通过命令行或使用调试器进行设置。 Log 语句使用可变长度的参数列表,与 printf 非常相似。

Google的日志记录模块在行业中广泛使用,并支持可以从命令行设置的日志记录级别。 例如(取自他们的文档(

VLOG(1) << "I'm printed when you run the program with --v=1 or higher";
VLOG(2) << "I'm printed when you run the program with --v=2 or higher";

您可以在此处找到代码 https://github.com/google/glog,在doc/文件夹中找到文档。