多线程情况下慎用localtime_r

最近有个需求,需要提升日志模块的性能。当前日志模块每秒钟处理的日志数量大概在55w左右,于是进行优化,在日志的IO线程中将sprintf剥离,提前将时间、日志等级等格式化处理。

于是这样就产生了一个问题,在IO线程中频繁的使用localtime_r来获取日期时间,在单线程中性能影响可能不大,然而我将localtime_r移动到各工作线程后,首先在windows下性能还是有55%左右的提升的,大概从56w到87w,而在linux下面,发现日志处理量居然只有20w左右,反而下降了50%,真是一件非常奇怪的事情。

在每个地方进行瓶颈测试,发现在localtime_r中消耗了大量的时间,造成了工作线程丢入IO线程的量降低了,其实IO的效率是高了,但是工作线程的效率却降低不少。后来查询了不少资料,发现在localtime_r中有锁,而多个工作线程同时请求时候,就造成了有些线程等待,性能确实会下降不少。

于是改成用gettimeofday来计算时间,日志的精度只需要到秒而已,这个函数够用了。唯一需要注意的是它的第二个参数有个时区的域,本机返回的值是-480,就是北京时间相对于格林威治时间提前了480分钟,所以根据时间戳计算日期时间的时候需要将时间戳偏移的时间加上一起算。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值