机器视觉

自由、创新、技术、经典

DotNet下GC的命门之一 --- 巨集合操作

如果算法结果或中间结果产生大量小对象的集合, 在GC中则会导致性能问题, 原因如下:

1、小对象(<80k)分配时在Generation 0上,随着数量的增加, 会触发大量的垃圾收集
2、垃圾收集时, GC会将他们搬移到Generation 1 heap上,这会带来性能损失, 相当于memcpy的成本
3、修改集合内部每个对象指针,指向新地址,这个性能损失很严重,如果是LinkedList或Tree类型, 成本更高
4、当Generation 1的heap不足时,GC会将他们从Gen1 heap搬移到Gen2 heap,上述2,3步再重复一遍
5、当你用多线程提速时,GC的收集行为会锁住所有线程,直到它工作完成,造成多线程反而性能下降

这个问题基本无法避免,除非.Net有以下改进:

1、分配对象时,能指定它分配在到Gen2 heap上或者在LOH上

2、GC允许背景运行或异步进行, 这个功能据说dotNet 4.0有所增强.

参考msdn的一篇博文:Garbage Collector Basics and Performance Hints

 

我用C++来实现上述算法,性能提高了将近5倍。

 

总结:

论开发效率,Dotnet是把好刀,但不要指望他是万能刀。

 

posted on 2010-01-13 04:43  塞伦盖蒂之鹰  阅读(417)  评论(0)    收藏  举报

导航