2011-08-18 22 views
0

例如,在draw方法中,我需要使用Rectangle的一个实例。像这样:小对象:经常创建还是重用?

Rectangle rect = new Rectangle(FrameSize * CurrentFrame, 0, FrameSize, FrameSize); 

或其他方式。定义临时的矩形数据成员,然后像这样使用它:

rect.X = FrameSize * CurrentFrame; 
rect.Y = 0; 
rect.Width = FrameSize; 
rect.Height = FrameSize; 

哪种方式更好?有一件事让我感到困惑的是,许多矩形经常创建,但许多代码解决方案使用第一种方法,而第二种应该小心内存消耗。

+1

Rectangle实例化的成本很小,除非您在每次绘制调用时都做很多事情,我不会担心。 –

回答

2

除非您已经通过仔细衡量证明重用可以提高性能,否则应该每次都创建一个新对象。

.NET处理对象创建和GC效率非常高,您不应该担心这里的任何性能问题。第二种解决方案需要更仔细的编码,以确保您不会重复使用其他地方使用的对象,并且您之前的状态没有变化。进一步你会有更多的对象老化到GC中的gen1或gen2。

+0

我通常在方法中创建临时实例,并仅在此方法内重用它们。 – lazychaser

+0

度量度量度量。 –

3

我个人会在大多数情况下使用第一种方法 - 理想情况下,如果类型是有意义的,并且类型是在您的控制之下,则使类型不可变。

垃圾收集器非常善于回收短暂对象 - 并且创建新对象意味着您不需要担心是否有某种仍旧引用旧对象(从而使其更改成为问题)。

2

对象有多久?如果他们只是在本地创建,然后被绘图方法使用,那么他们很可能会被收集到第零代,这非常有效。

重新使用临时矩形的问题是,如果您试图让它挂在方法的生命周期之外,那么对于通常的修改将会产生问题。作为一般规则,如果在分析后发现#1成为问题,我会考虑#2,并且只考虑#2。

1

当涉及到可能的错误时,前者更安全,对于Rectangle类是可变的,可以产生一些奇怪和难以察觉的效果。

我不认为性能损失严重到足以冒险冒险在可变结构的野外世界。

0

考虑到结构分配上栈,绘制方法,我个人会选择第一种方法的情况下,事实上,作为

  1. 对象创建和初始化

  2. 使用

  3. 在我们离开该功能时推到GC。

所以这是一个快速创建并快速从内存中移除的小对象。

0

我会在实例的基础上做到这一点。重用它并不会获得太多收益,并且使代码更易于破解。通过在实例的基础上进行,您可以在方法中封装一些逻辑,并且不必担心由于方法之外的因素而导致中断。