使控制台输出是否"verbose"的最快方法
Fastest way to make console output "verbose" or not
我正在制作一个小系统,我希望能够在整个系统中切换"详细"文本输出。
我制作了一个名为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 下
实现这一点的一些变体:
- 使用一些记录器库。这是最佳选择,因为它为您提供了最大的灵活性和一些有用的经验;)而且你不必设计什么。例如,看看谷歌GLOG。
- 定义一些宏,允许您通过仅更改宏来打开/关闭所有这些日志。但是要正确写出这样的马可并不容易。
- 将条件标志标记为 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/
文件夹中找到文档。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 使控制台输出是否"verbose"的最快方法