boost log -- header only 的心酸历程(五) 优化

之前写过这个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。这个很简单,这里就不实现了。

 

 

关注公众号获取更多信息:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值