制作控制台输出的最快方法"详细"或不

时间:2017-06-19 13:31:41

标签: c++

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

我创建了一个名为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;
}

现在您可以看到我在该构造函数中有很多ifs。我真的不想要那个,因为这会减慢我的申请速度。我需要尽可能快地删除&#34;加载栏&#34; (这有助于我确定程序停止运行的功能)。

实现这一目标的最佳/最快方法是什么?

我系统中的每个人都在命名空间REBr

3 个答案:

答案 0 :(得分:1)

实现这一目标的一些变体:

  1. 使用一些记录器库。这是最好的选择,因为它给你最大的灵活性和一些有用的经验;)你不必设计一些东西。例如,请查看Google GLOG
  2. 定义一些宏,允许您通过仅更改宏来打开/关闭所有这些日志。但正确编写这样的马克并不是那么容易。
  3. 将您的条件标记标记为constexpr。这样你可以切换标志,并根据其值,编译器将优化编译程序中的if。但是if仍然会在代码中,所以它看起来有点笨重。
  4. 无论如何,所有这些选项都需要程序重新编译。无需重新编译就无法达到最高速度。

答案 1 :(得分:0)

我经常使用支持调试级别的Logger类。电话可能如下:

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

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

答案 2 :(得分:0)

Google's logging module在业界广泛使用,并支持您可以从命令行设置的日志记录级别。例如(取自他们的文档)

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/文件夹中的文档。