小对象:频繁创建或重用

本文关键字:创建 对象 | 更新日期: 2023-09-27 18:06:07

例如,在绘制方法中,我需要使用矩形的实例。这样的:

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

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

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

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

小对象:频繁创建或重用

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

。NET处理对象创建和GC非常有效,您不应该担心这里的任何性能影响。第二种解决方案需要更仔细的编码,以确保不会在其他地方重用正在使用的对象,并且不会拖着以前的状态。此外,在GC中将有更多的对象老化为gen1或gen2。

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

垃圾收集器非常擅长回收寿命较短的对象——并且创建新对象意味着您不需要担心某些对象是否仍然有对旧对象的引用(从而使对其进行更改成为问题)。

对象的寿命是多长?如果它们只是在本地创建,然后由绘图方法使用,那么它们很可能会在第0代被收集,这是相当有效的。

重新使用临时矩形的问题是,如果你试图让它在方法的生命周期之后继续存在,那么它通常会对修改产生问题。

作为一般规则,我会选择第1条,如果您稍后在分析后发现第1条成为问题,则只考虑第2条。

当涉及到可能的bug时,前者更安全,因为Rectangle类是可变的,可能会产生一些奇怪且难以发现的效果。

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

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

  1. 对象创建并初始化

  2. 使用
  3. 当我们离开函数时被推送到GC

所以这是一个快速创建和快速从内存中删除的小对象

我会以实例为基础。通过重用它,您不会获得太多好处,而且它使您的代码更容易被破坏。通过在实例基础上这样做,您可以将一些逻辑封装在方法中,并且您不必担心由于方法之外的因素而导致它中断。