C语言多线程异步日志库的性能瓶颈,你知道如何解决吗?

各位大佬,小弟最近撸了一套C++多线程异步日志库用来练手(支持Linux,Windows,MacOSX),目前已经完成。支持按照日志文件的大小和日期的变动进行滚动,有一个后台线程进行写入硬盘操作。具体太多的实现细节就不细说了,目前在我的机器上(i5-3750四核,16G内存,7200转的硬盘)测试数据如下:

【1. 单线程每次写入100字节数据,写入500W次,测试10次,平均耗时为:5.103秒】

【2. 八线程,每个线程写入200W次,每次写入100字节数据,共计1600W次的日志写入,测试10次,平均耗时为:6.818秒】

测试数据不太理想,通过VS的性能分析工具发现,【%65】的性能损耗都在Line:153写入日志内容中的ev_vsnprintf上(ev_vsnprintf只是把各个平台的接口统一包装了一下,实际还是vsnprintf或者_vsnprintf),那么请问这种情况应该如何继续优化下去呢?第一次在CSDN发帖,分少人穷

希望大佬不要嫌弃~

关于怎么快速学C/C++游戏编程,有什么方法,这个问题,想必大家都已经心中有数了,打算深入了解这个行业的朋友,可以加下小编的C/C++游戏编程学习裙:125+471+716,不管你是小白还是大牛,小编我都欢迎,不定期分享干货,包括小编自己整理的一份2018最新的C/C++资料和0基础入门教程,欢迎初学和进阶中的小伙伴。

每天晚上20:00我都会开直播给大家分享C/C++游戏编程学习知识和路线方法,群里会不定期更新最新的教程和学习方法(进群送2018C/C++游戏编程学习教程),大家都是学习C/C++的,或是转行,或是大学生,还有工作中想提升自己能力的前端党,如果你是正在学习C/C++的小伙伴可以加入学习。最后祝所有程序员都能够走上人生巅峰,让代码将梦想照进现实,非常适合新手学习,有不懂的问题可以随时问我,工作不忙的时候希望可以给大家解惑。

把ev_snprintf做成一个函数,然后inline试试

我把ev_vsnprintf改成宏定义,然后对应不同平台的vsnprintf或者_vsnprintf,结果是同样的。。。还是%65的性能瓶颈卡在这里

就是这个函数的本身的问题了。

那么可以考虑一下,在线程中格式化好字符串,然后再直接写入字符串到缓冲区,好吧,目前看着也是这样的。。。

似乎没有什么办法了。

只想确认一下,使用append的时候,是不是并行使用的?

是的,每个线程都执行同一个入口函数,函数大体实现为:一个for循环,写入固定的次数,每次都调用append()接口,这个是没问题的。并且,即使是单线程测试,性能瓶颈也还是这个地方。当然我也提供了一个append(const char* msg, uint32 msglen);的接口,使用这个接口就不会添加各种日志头信息,直接写入到日志缓冲区中,然后由后台线程直接写入硬盘,几乎没有任何中间过程。使用此接口进行上述测试的话,执行效率是原来的12倍。也就是说:

【1. 单线程每次写入100字节数据,写入500W次,测试10次,平均耗时为:0.422秒】

【2. 八线程,每个线程写入200W次,每次写入100字节数据,共计1600W次的日志写入,测试10次,平均耗时为:2.215秒

性能倒是达到了我的预期,只是这样子就与我的目的不一样了,毕竟只记录原始的字符串没有太大的用处。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180517A13O6B00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券