Сохранить значение по неопределенному индексу в массиве. Что быстрее? - PullRequest
1 голос
/ 03 марта 2012

Скажем, я хочу добавить значение в массив, но не имеет значения, где, пока текущий элемент с этим индексом равен нулю. Этот нуль может быть где угодно в массиве, в случайных местах. Я просто хочу иметь свою ценность где-то в моем массиве. Должен ли я повторить это так:

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

Таким образом, возможно, придется перебрать множество элементов, прежде чем он найдет нулевое место. Будет ли быстрее использовать другой тип, то есть ArrayList?

Это для игры, поэтому производительность очень критична, и это может быть сделано 300 раз в секунду (также доступ и удаление предметов). Так что для игры, что мне лучше всего использовать для хранения предметов, для итерации?

Ответы [ 2 ]

1 голос
/ 03 марта 2012

В прошлом я использовал один способ - использовать массив и очередь.Каждый раз, когда вы добавляете объект в массив, вы сначала проверяете свою очередь на наличие пустых слотов.Каждый раз, когда вы уничтожаете объект, вы устанавливаете пустую ячейку массива и добавляете индекс в очередь, чтобы вы могли быстро вытащить его позже.Во время моих тестов это было быстрее, чем List, потому что вы изменяете размер массива, только если увеличиваете его.

code wise

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;
}
0 голосов
/ 03 марта 2012

Вы можете выполнить рефакторинг этого произведения различными способами, используя многочисленные реализации Collection , но вам это нужно?Это необходимо?Это улучшит ваши выступления?У вас есть ограничения в реальном времени (уложиться в срок)?Эти несколько строк кода - ваше узкое место?Ваш массив имеет 64 ящика, можно ли изменить его размер?Являются ли элементы в основном нулевыми в конце массива в начале?Вы должны быть потокобезопасными?Вы провели стресс-нагрузочный тест и измерили, сколько времени вы проводите в этих строках (среднее, самое низкое и самое высокое)?

Существует множество способов оптимизации, которые могут зависеть от поведения вашего приложения.

Может быть, вы можете немного переосмыслить свою программу, чтобы улучшить производительность.ИМО это обычно самый эффективный.Вы думали заменить свой массив чем-то другим?Вы можете сделать свою собственную (облегченную) реализацию интерфейса Queue для управления соответствующими (не нулевыми) элементами.Если вы полагались на позицию в массиве, то вы можете добавить эту информацию в элементы (я полагаю, это объекты).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...