注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

C++ auto_bufer 和 高性能日志库Pantheios  

2012-11-13 16:04:40|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
Pantheios 的网页说他的库比其他的 日志库要快很多,看这里的http://www.pantheios.org/related_material.html
的解释,大概是说,log startment都是使用栈上的内存吧,只是在log被启用的时候,才有最多一个的日志参数的复制。其实就是使用 一个  suto_bufer的辅助类,在栈上留一段空间,比如2048字节。 然后那些 log信息字串都是放到这个 栈上。 只有参数太多,格式化出来的字符串太长的时候才有 suto_bufer 去堆里面动态申请内存。 这样写日志的时候大多都是没有动态内存申请操作性能就比较高。
       
关于这个auto_buffer的解释,给的参考是: 写的也比较清楚。
 Efficient Variable Automatic Buffers
http://collaboration.cmc.ec.gc.ca/science/rpn/biblio/ddj/Website/articles/CUJ/2003/0312/0312wilson/cuj0312wilson.htm

不过看这个看下面这个.stlsoft的文档,举的例子就很清楚了。其实就是把 栈上类似的char [2048] 这样的局部变量给封装一下,便于使用而已。如果这个缓存不够用,再去用new 动态申请。
auto_buffer 
http://www.stlsoft.org/doc-1.9/

boost里面也有一个类似的实现。
http://www.boost.org/doc/libs/1_46_0/boost/signals2/detail/auto_buffer.hpp

简单的说,就是避免 写每一条日志时的动态分配内存和释放。 不过这有个问题,如果trace语句比较多,嵌套的话,可能占用栈比较多,在栈空间比较小的环境下,可能要注意。比如在linux内核8k的栈,这样子搞很容易就溢出了。那些格式化的开销看上去是不能避免了。Pantheios看起来和现在的接口整合起来不太方便。

网上有陈硕写的 muduo网络库里面用到的一个日志库
muduo's c++ high-perf logging
http://xanpeng.github.com/programming/2012/06/18/muduo-logging.html
他的logstream应该也是直接在栈上的内存,避免动态内存分配。这里有代码。
https://github.com/chenshuo/recipes/tree/master/logging

当前项目,有个trace的实现,用来辅助记录代码流程,性能很差,看了一下,那些string的日志,每次日志都需要动态内存分配,写完还要free。性能分析发现这个确实代价比较大啊。希望可以改写一下避免这种动态内存分配。 





  评论这张
 
阅读(1119)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017