之前写过这个boost log的系列,实现了一个小的工程,这样可以拿去用。
最近看这个工程,发现有个地方可以优化。
每次我们去调用__LOG的时候,我们都会去组装这个message。
tostringstream var; \
var << "[" << __FILE__ << ":" << __LINE__ << ":" << __func__ << "] \n" \
<< msg; \
if (ACTIVE_LOGGER_INSTANCE) \
ACTIVE_LOGGER_INSTANCE->levelin##_log(var.str()); \
我们知道,对于stringstread的操作很耗时,这就造成了即使loglevel没有到,我们也组装了。解决方案就是在组装之前判断一下loglevel。同时还要注意的是,如果你把这个message放到函数参数里边,其实调用的时候也去组装了。
解决这个问题有两种方法,第一种是传统的方法,那就是通过#define让编译器在编译的时候展开这个message。
#ifdef __LOGGING_ENABLED
#define __LOG(levelin, msg) \
\
{ \
if (ACTIVE_LOGGER_INSTANCE->get_log_level() <= levelin##_level) \
{ \
tostringstream var; \
var << "[" << __FILE__ << ":" << __LINE__ << ":" << __func__ << "] \n" \
<< msg; \
if (ACTIVE_LOGGER_INSTANCE) \
ACTIVE_LOGGER_INSTANCE->levelin##_log(var.str()); \
} \
}
这样展开的log长这样:
可以看出,log的组装是在if里边。
还有一种思路就是调用log函数的时候,传的就不是一个string了而是一个lambda函数。它可以捕获外边的变量,从函数里组装string。这个很简单,这里就不实现了。
关注公众号获取更多信息: