假设我想为数组添加一个值,但只要该索引处的当前项为null,它就无所谓。这个null可以在数组中的任何位置,随机位置。我只想拥有自己的价值 我的数组中的某处。我应该像这样迭代它:
for (int i = 0; i < 64; i++) {
if (items[i] == null) {
items[i] = obj;
return;
}
这样它可能必须在找到空点之前迭代很多元素。使用其他类型,即ArrayList会更快吗?
这适用于游戏,因此性能非常糟糕,每秒可执行300次(也可以访问和删除项目)。所以对于游戏来说,我最应该用什么来存储项目,迭代?
答案 0 :(得分:1)
我过去使用的一种方法是使用数组和队列。每次向阵列添加对象时,首先检查队列以查看是否有空插槽。无论何时销毁对象,都可以将数组槽设置为null,并将索引添加到队列中,以便以后快速将其拉出。在我的测试期间,这比List更快,因为如果你把它放大,你只会调整数组的大小。
代码明智
Queue<int> emptySlots;
Object[] arrayOfStuff;
public void AddStuff(object stuffToAdd)
{
if (this.emptySlots.Count > 0)
{
int index = this.emptySlots.Dequeue();
//make sure your objects know their position in the array
stuffToAdd.ID = index;
this.arrayOfStuff[index] = stuffToAdd;
}
else
{
//resize array and add new object to end rememebering to fetch its id
}
}
public void RemoveStuff(object stuffToRemove)
{
this.emptySlots.Enqueue(stuffToRemove.ID);
this.arrayOfStuff[stuffToRemove.ID] = null;
}
答案 1 :(得分:0)
您可以使用众多Collection实现以多种不同方式重构该工作,但您需要它吗?这有必要吗?这会改善你的表现吗?你有实时约束(符合截止日期)吗?这几行代码是你的瓶颈吗?你的阵列有64个盒子,它可以调整大小吗?这些项目在开头的数组末尾是否为空?你需要线程安全吗?您是否进行过压力/负荷测试并测量您在这些线路上花费的时间(平均,最低和最高)?
您可以执行许多优化,但这些优化取决于应用程序的行为。
也许您可以稍微重新考虑一下您的计划以提高表现。 IMO通常是最有效的。您是否考虑过用其他东西替换阵列?您可以执行Queue接口的自己的实现(轻量级)来管理相关(非空)项。如果您依赖于数组中的位置,那么您可以在项目中添加该信息(我猜这些是对象)。