【发布时间】:2014-05-08 01:54:55
【问题描述】:
我的应用程序将包含列表。一个列表中的每个对象都必须绑定到另一个列表中的对象。我的想法是通过列表中的索引来访问它们。
List<MyType1> listNrOne;
List<MyType2> listNrTwo;
foreach (int index in indexes)
{
someObj.SomeFunc(listNrOne[index], listNrTwo[index]);
}
另外,listNrOne[index] 和 listNrTwo[index] 将与现实生活中的对象相关联。
- 有时根本不需要列表中的对象 - 为使列表保持特定顺序,索引项将为空。
- 有时需要并创建一个对象,例如在循环中使用 10 秒并不断更新,然后就不再需要了。
我想保持应用程序内存高效。所以我不会让 GC 收集不必要的对象并重用它们。所以:
// The application does not need listNrTen[11]
queueOfNotNeeded.Enqueue(listNrTen[11]);
listNrTen[11] = null;
// ...
// suddenly an object of the type is needed
// so instead of creating a new one
// the application will reuse existing ones (one that wasn't GCd)
// listNrTen[159] is currently null
listNrTen[159] = queue.Dequeue();
问题: 这会导致内存碎片化吗?随着时间的推移,它会保持多高的效率?
编辑:应用程序是一个游戏,所以性能很重要。
【问题讨论】:
-
该模式称为对象池(或享元,具体取决于具体情况)——您应该研究一下。
-
在模糊的上下文中谈论效率也很困难。您会受益于设置一种在 您的 上下文中测试不同选项的方法
-
很高兴知道,但我到处都看到使用了 Dictionary 和 HashMap。所以我看不出这有什么帮助。
-
你能解释一下你所期望的记忆碎片吗?
-
对象以块的形式创建(例如:同时创建 15 个)。循环需要在循环中有效地访问它们。如果应用程序删除了第 15 个引用。然后将之前的第 15 个对象设为第 4 个。它需要跳过内存(不确定)。