创建新对象与覆盖现有对象(性能)

时间:2017-06-08 12:40:50

标签: c# .net performance object testing

我必须创建大量略有不同的对象进行测试。所有的属性都被改变为不同的对象,但是一旦我创建了对象&用它做点什么,我不再需要它。 我应该创建一个新的本地对象,还是只覆盖&重新分配存在于循环范围之外的对象?

新(本地)对象

int testCases = 10;
for(int i=0; i<testCases; i++){
    TestObject localObject = new TestObject();  //local variable for the loop
    //change properties & do stuff with the test object
}

重新分配/覆盖现有对象

TestObject myObject;
int testCases = 10;
for(int i=0; i<testCases; i++){
    myObject = new TestObject();    //reassign object that exists outside the loop
    //change properties & do stuff with the test object
}

&#34;更改属性&amp;做东西&#34;并不重要,我知道如何创建我的对象的不同版本,只是不确定我是否应该在每次迭代时销毁它们。

1 个答案:

答案 0 :(得分:4)

您发布的两个代码段之间没有功能差异。无论您将局部变量放在代码中的哪个位置,都会在每次循环迭代中进行分配。

如果您想节省分配,我可以为您考虑两种可能的解决方案:

  1. 使用struct而不是class - 这会导致只使用堆栈空间而不是堆。只有堆使用会导致GC压力。但是,如果你经常在结构中传递,则需要通过ref而不是值来传递以避免复制。结构也“希望”是不可变的,所以你对它们的使用方式有一点限制,但通常不是很重要。如果您需要了解有关结构/值类型的更多信息,请参阅here

  2. 使用对象重置/重用语义 - 而不是分配新对象并用数据填充它,只需重复使用数据重新填充相同的对象,而无需重新分配它。您基本上将对象视为池对象。在非平凡的情况下,合并可以快速复杂化,但在某些情况下,这是避免额外内存压力的好方法。