【问题标题】:Store value at unspecified index in an Array. What's faster?将值存储在数组中的未指定索引处。什么更快?
【发布时间】:2012-03-02 21:50:43
【问题描述】:

假设我想向数组添加一个值,但在哪里并不重要,只要该索引处的当前项为空即可。这个空值可以是数组中的任意位置,随机位置。我只想拥有我的价值 某处在我的数组中。我应该像这样迭代它:

    for (int i = 0; i < 64; i++) {
        if (items[i] == null) {
            items[i] = obj;
            return;
        }

这样它可能需要遍历很多元素才能找到一个空点。使用另一种类型(即 ArrayList )会更快吗?

这是针对游戏的,因此性能非常关键,每秒可能执行 300 次(还包括访问和删除项目)。那么对于一款游戏来说,我应该最好使用什么来存储物品、进行迭代呢?

【问题讨论】:

  • 我不确定您在做什么,但请尝试使用队列或列表
  • 如何检索项目?你需要随机访问它们(听起来像)还是你只是迭代它们。您还可以考虑使用 Map 或 Set,具体取决于您访问项目的方式。您是否实际测试过一些标准 Java 集合的性能?在您测量之前,没有必要担心可能会影响性能的因素...
  • 我只是迭代它,然后使用它。

标签: java arrays arraylist


【解决方案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;
}

【讨论】:

  • 您可能需要稍微修改一下代码,我认为这是一个 C# 问题,我很确定 Queue 是 java 中的一个接口,但它应该非常相似
  • LinkedList 是我想到的,还是这样对性能不好?
  • 如果我没记错的话,即使你使用了队列,查找不会花费时间吗?
  • LinkedList 看起来会提供您需要的功能,但我不能说它的性能会比任何其他队列类型更好或更差。最好的办法是在你打算使用它的条件下测试它的性能,看看你的应用程序是否可以接受速度
  • @thinksteep 据我所知,列表和队列、搜索操作以及添加或删除项目时发生的自动内部数组调整大小是您最大的成本。将队列与自管理数组一起使用将防止数组在您销毁其中的对象时缩小数组的大小,就像列表倾向于做的那样。现在我的大部分经验来自 c#,但功能可能非常相似
【解决方案2】:

您可以使用众多 Collection 实现以多种不同方式重构该工作,但您需要它吗?那有必要吗?这会提高你的表现吗?你有实时限制(满足最后期限)吗?这几行代码是你的瓶颈吗?你的数组有 64 个盒子,可以调整大小吗?开头的数组末尾的项目大多为空吗?你需要线程安全吗?您是否进行了压力/负载测试并测量了您在这些方面花费了多少时间(平均、最低和最高)?

您可以进行许多优化,但它们将取决于您的应用程序的行为。

也许您可以稍微重新考虑一下您的程序以提高性能。 IMO 它通常是最有效的。你有没有想过用别的东西代替你的阵列?您可以自己实现(轻量级的)Queue 接口来管理相关(非空)项目。如果您依赖数组中的位置,那么您可以在项目中添加该信息(我想这些是对象)。

【讨论】:

    猜你喜欢
    • 2023-01-29
    • 2011-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2013-07-06
    相关资源
    最近更新 更多