c#和.net垃圾收集器性能
本文关键字:收集器 性能 net | 更新日期: 2023-09-27 18:10:55
我正在尝试用c#和。net制作一款游戏,我计划在游戏世界中执行更新游戏对象的消息。这些消息将是c#引用对象。
我想要这种方法,因为如果我想让游戏成为多人游戏,这样做会更容易通过网络发送它们。
但是如果我有很多消息,这对垃圾收集器来说不是很有压力吗?这不会影响游戏玩法吗?消息类本身非常小,最多只有4或5个成员。
对于游戏世界中的每个对象,这些消息将每秒生成几次。
在。net中,垃圾收集器有3代,第0代,第1代和第2代。每当GC在一代中收集对象失败时,该对象将被提升到下一代。
如果对象大于85kb,则可能会遇到问题。这些对象将自动存储在大对象堆中。在以下情况下,将自动收集大对象堆:
- 分配超过大对象堆阈值。
- 系统内存不足。
-
System.GC.Collect
在第2代被调用。
问题是,当收集大型对象堆时,对象的内存被释放,但LOH没有被压缩。因为LOH是碎片化的,如果LOH上没有足够大的空间容纳您的对象,您可能会引发SystemOutOfMemory
异常。
对象池等技术通常用于提高LOH的性能。http://en.wikipedia.org/wiki/Object_pool_pattern
来源:http://msdn.microsoft.com/en-us/magazine/cc534993.aspx
UPDATE: . net 4.5.1将允许您使用GC在应用程序中按需压缩LOH。收集API。
在以后的版本中,更准确地说是4.5,在代级别0和1上异步运行GC。这大大减少了GC的影响。
如果你的对象是短寿命的,大多数时候它们不应该从0代传递。级别0是GC清理速度最快的一代。
底线是,我不会因为担心GC性能而考虑过早地优化代码。
过早优化是万恶之源 DonaldKnuth
就我个人而言,我推荐这篇文章来更深入地理解