C#和.NET垃圾收集器的性能(C# and .Net Garbage collector perf

2019-09-01 04:48发布

我试图在C#和.NET一个游戏,我正打算实现一个更新在游戏世界中的游戏对象的消息。 这些消息将是C#的参考对象。

我想这种做法,因为做这种方式会更容易通过网络发送他们,如果我希望游戏是多人。

但是,如果我有很多的消息,会不会是垃圾收集相当紧张? 并不会影响游戏? 消息类本身是具有4名或5个成员相当小至多。

这些消息将产生一对夫妇每秒钟用于在游戏世界中的每个对象。

Answer 1:

在以后的版本中的GC,但更确切地说4.5,异步运行世代级别0和1这大大降低GC的影响。

如果你的对象是短命的,他们不应该产生等级0的大部分时间通过。 0级是最快的一代由GC来清理。

底线,我不会考虑过早优化我的代码生怕GC性能。

过早的优化是所有罪恶的 DonaldKnuth

就个人而言,我建议这个文章的更深层次的理解



Answer 2:

在.NET垃圾收集器具有3代,第0代,第1代和第2代每次GC未能收集的对象中生成,该对象将被提升到下一代。

您可能会遇到问题,如果你的对象比85KB大。 这些对象将被自动存储在大对象堆。 大对象堆将被自动收集在下列情况下:

  • 分配超过大对象堆阈值。
  • 系统在内存不足的情况。
  • System.GC.Collect被称为第2代。

问题是,被收集大对象堆时,对于对象的存储器被释放,但LOH并不压实。 因为LOH是零散的,你可能会得到SystemOutOfMemory抛出的异常,如果没有对蕙你的对象足够大的空间。

技术,比如对象池通常用于改善LOH的性能。 http://en.wikipedia.org/wiki/Object_pool_pattern

来源: http://msdn.microsoft.com/en-us/magazine/cc534993.aspx

UPDATE:净4.5.1将允许你这样做使用GC.Collect的API应用程序中的LOH按需压缩。



文章来源: C# and .Net Garbage collector performance