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

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

ZeroMQ抱怨c++ 第二篇,导致内存碎片化  

2012-09-01 14:16:28|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

http://www.250bpm.com/blog:8 


前面第一篇说的c++的异常处理机制,这个说的面向对象的设计导致的内存碎片化。

都很有道理,我也是很赞同文章的观点的。


前段时间我也文章所说的list的删除和内存碎片问题。当时用 stl的list来做 队列,cancel操作的时候发现想把元素自身从队列删掉,c++的支持根本就不行,默认的删除是O(n)的,后来是就是按照 linux内存的list 自己实现了队列,也就是 文章所说的c方式的实现。再后来发现使用 iterator 也是可以做到 O(1)的删除的,并写了文章

http://gmd20.blog.163.com/blog/static/1684392320125145516797/ 


        但和zeromq作者说的那样,这种iterator的方式确实不够优雅。我的代码里面使用的linux 内核类似的 list,确实性能要比stl的list更适合应用场合吧, 这个c的list实现,在用性能工具分析采样的时候,确实非常的好,采样点几乎没有落到list的操作上,但其他的stl的容器的操作开销就有点大,采样可以看得出来。  这也可能是 zeromq作者说的 内存碎片导致的,指针和元素在内存上面是不连续的,影响缓存友好性。

        记得以前,c++之父的一个文档说,好像百万级元素的容易,从vector删除元素,比从list中删除要快就是这个道理。现在经常也发现,c++的容器或者某种封装类确实不容易控制内存的动态分配这些,比如boost::function 和 asio的异步调用,vector的复制,都可能会有动态内存分配,不容易控制。像在map<string,int> 里面 使用const char *作为key去查找时的string临时对象等。 确实也可能导致内存分块了,结果就是缓存不命中,程序性能下降。

      


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

历史上的今天

评论

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

页脚

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