月下的博客

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  34 Posts :: 0 Stories :: 59 Comments :: 0 Trackbacks

常用链接

留言簿(5)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

  这周末准备笔试,正好顺路查查STL”被人所诟病的性能问题”,然后一直顺路查到内存分配优化的玩意,(以前在自己的代码里都是按着ogre用nedmalloc做了个allocator)自己也懒的profile,就到damedev上搜了点,讨论这块的还真有几个不错的帖子,所以就做个整理吧:
1,http://www.tantalon.com/pete.htm
  首先是Pete Isensee的众多介绍使用C++和STL的文章,里面非常详尽,许多都是之前在game programming gem(很多可能看过吧:))和GDC上发表的文章,虽然很基础,不过扫一遍复习一下也挺有帮助,关于是否要替换默认allocator,pete的观点也是先确定瓶颈是否是allocation再优化,最后他还提供了一套简单的stl allocator测试框架。个人觉得,往往STL性能差的更多原因来自于对其错误的使用~

2, http://www.gamedev.net/topic/567295-time-for-allocating-via-os-or-manually/page__p__4630106__hl__nedmalloc__fromsearch__1#entry4630106
  此帖lz自己实现了一个heap,结果实测下来性能和默认的new差太多,后面的讨论里讲到了关于内存分配这块的优化权衡,即是否在游戏里我们会有那么多次的new,delete,也讨论了一些关于OS是如何去管理内存分配的(操作系统课俺基本为0.。红黑树是王额。。),楼下更贴出了好多关于内存分配的库(Intel的TBB)或者链接,很适合像我这样的内存小白入门。

3,http://www.gamedev.net/topic/587225-nedmalloc-and-pools/page__p__4730726__hl__nedmalloc__fromsearch__1#entry4730726
  这个帖子虽然短但是samoth给出了很有趣的结论(其实想想也正常),在他的测试里nedmalloc败给了默认的new,delete。用ogre论坛里某人的话说就是:nedmalloc是用来减少内存碎片的,在上时间运行的程序上会有着很好的性能提升(MMORPG~网络不懂的人飘过),做某一些内存有局限的平台时,可能Boost::Pool或者默认的new才是更好的选择。(当然replacement new还是可以用来调试的)

posted on 2011-03-13 09:47 月下圆舞曲 阅读(3700) 评论(9)  编辑 收藏 引用

Feedback

# re: 关于内存分配优化的一些讨论 2011-03-13 11:08 expter
一般通过内存池来提高分配效率,减少碎片。  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-13 13:27 月下圆舞曲
@expter
虽然没用过Boost::Pool,不过貌似就是这个用的,我觉得这玩意肯实际效率应该还是要比咱自己手写要来的高,当然手写练水平那是必然的。。
  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-13 14:41 lazy
如果觉得默认的stl实现效率不理想可以试试stlport。我们项目用了这个,对效率有点帮助,有点。
当然用这东西替换默认的stl实现有点麻烦,不过花些时间还是可以搞定的。

不过我觉得stl的默认实现还是很不错了。通过优化stl的默认行为来提升效率实在不是一个好办法(花很多时间不见得有好结果),还是多从上层算法上想办法  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-13 16:54 月下圆舞曲
@lazy
额~~开头的话我打引号了,其实我是stl的死忠~~  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-15 09:30 Kevin Lynx
@月下圆舞曲
貌似vs默认带的STL实现是不带内存池实现的,它的allocator就是个malloc的包装。可以试着把SGI里的那个allocator拿出来,这个allocator算是比较高效的小块内存池。鉴于STL本身在构造容器时就支持自定义的allocator,所以要适配进vs默认的STL应该不困难。  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-15 17:19 月下圆舞曲
@Kevin Lynx
池我是说boost啦~~多谢多谢,我去看看sgi的去~~  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-16 02:49 内存fans
boost::mt19937 rng;
boost::uniform_int<> six(60000,90000);
boost::variate_generator<boost::mt19937&, boost::uniform_int<> > die(rng, six);

const int count = 10;
int allocsize[count]={0};
for (int i=0; i<count; ++i)
{
int x = die();
allocsize[i]=x;
}

std::vector<int> nAry1;
std::vector<int, boost::pool_allocator<int>> nAry2;

boost::timer t;
for (int i=0; i<count; ++i)
{
//nAry1.reserve(allocsize[i]);

for (int j=0; j<allocsize[i]; ++j)
{
nAry1.push_back(j);
}
}

printf("%lf\n", t.elapsed());
t.restart();

for (int i=0; i<count; ++i)
{
//nAry2.reserve(allocsize[i]);

for (int j=0; j<allocsize[i]; ++j)
{
nAry2.push_back(j);
}
}
printf("%lf\n", t.elapsed());

printf("%d %d\n", nAry1.capacity(), nAry2.capacity());

getchar();

诸位自己看结果吧,boost.pool完败,不过似乎它就不是这样用的  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2011-03-18 14:28 空明流转
@Kevin Lynx
Allocator一定要有线程安全性。  回复  更多评论
  

# re: 关于内存分配优化的一些讨论 2013-01-05 10:11 liangairan
nedmalloc我自己做过实验,随机地大量分配内存和释放内存,这个速度比默认的new和delete快很多的。单一地new和delete是慢。  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理