pnlog-记录

今天比较了下pnlog和业界比较有名的日志库spdlog的各方面性能,
首先在mac平台下,单线程写入:
pnlog稍逊色于spdlog,差距在15~20%左右,分析了下原因,主要差距在两个方面:

  1. 日志格式化方面,spdlog使用了fmt库,而我目前没有使用第三方的格式化库,只是用函数模板包装了个较为好用的函数,由于可能有多次std::string复制开销,因此在极限性能测试条件下问题会比较突出。
  2. spdlog默认是不会在每次日志写入之后flush的,而我做了这个设置。

用了几个特殊的测例(原始字符串写入,故不需要格式化,以及将pnlog也修改为默认不flush),性能差距在10%左右,也算达标了。
注:spdlog的异步模式比同步模式居然要慢,我大概浏览了他的源代码,异步模式下spdlog为每一条日志都做一个异步的转发,写入操作,而不是先将多条日志缓存在一个buf中然后一次写入,这样会少很多次write调用,因此速度当然会慢很多。

mac平台多线程写入:
开了3个线程同时向一个日志写入数据,pnlog异步模式的效果要比spdlog好很多,比spdlog的同步模式要快3-4倍,比异步模式要快7-8倍。pnlog的同步模式是这几种中最慢的,原因是由于每次flush操作,在极限测试条件下会放大flush的开销,我把每次的flush操作去掉之后速度是spdlog同步模式的2倍。以时间消耗为衡量目标得到如下比例:
pnlog同步(无flush):pnlog异步:spdlog同步:spdlog异步:pnlog同步(有flush) 约等于3 : 2 : 7 : 14 :29。个人还是很满意这个结果的。

linux平台(使用unbuntu系统),单线程写入:
spdlog速度还是杠杠的,但是pnlog就让我大跌眼镜了,速度比mac平台下pnlog同样条件慢了4-5倍左右,比spdlog就差更远了,我用gprof分析了下,发现绝大部分消耗在new申请内存上。。。我尝试用calloc代替了new之后性能提升了一倍,但是离我的目标仍有差距,因此考虑提供自定义的内存池来解决这个问题。由于这个问题,我没有继续进行性能比较了。

你可能感兴趣的:(日志,c++)