GetType () == производительность типа - PullRequest
1 голос
/ 02 сентября 2011

Я делаю игру XNA и звоню по следующему коду от 2 до 20 раз за обновление.Я попробовал поискать в Google, и кажется, что это полумедленно, поэтому я просто подумал, что могу спросить, есть ли более быстрый способ сравнения типов?

Код:

    public Modifier this[Type type]
    {
        get
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].GetType() == type)
                {
                    return this[i];
                }
            }

            throw new NotImplementedException("Fix this");
        }

        set
        {
            for (int i = 0; i < this.Count; i++)
            {
                if (this[i].GetType() == type)
                {
                    this[i] = value;
                }
            }

            if(System.Diagnostics.Debugger.IsAttached)
                System.Diagnostics.Debugger.Break();
        }
    }

Этот коднаходится в классе ModifierCollection, который наследуется от List.Модификатор является частью двигателя частиц.Кроме того, моя игра не находится в состоянии, когда я действительно могу проверить это, поэтому я не могу проверить это, но это должно сработать, верно?

Я читал что-то о RunTimeTypeHandles, что должно быть быстрее, я должен его использовать?

РЕДАКТИРОВАТЬ: что я собираюсь сделать с этим, я могу сделать следующее:

    (particleEffect["NameOfEmitter"].Modifiers[typeof(SomeCoolModifier)] as SomeCoolModifier).Variable = Value;

В основном я просто хочу изменить значение некоторых модификаторов во время выполнения.

РЕДАКТИРОВАТЬ 2: Я только что понял, что я могу просто сохранить ссылку Модификатор в класс, где я в данный момент вызываю это: P Может быть, не такой чистый код, если у меня есть 5-10 модификаторов, но должен устранить эту проблему.

Ответы [ 3 ]

4 голосов
/ 02 сентября 2011

Если вам не нужна какая-либо дополнительная функциональность, предоставляемая Type, и вас интересует только абсолютное равенство между типами - т. Е. Вам не нужно поддерживать наследование - RuntimeTypeHandle - это Самый быстрый способ сделать это сравнение.

Правда, я бы усомнился, не является ли это слабым местом вашего класса. Если у вас нет веской причины для прямой проверки типа, вероятно, лучше выставить какое-либо значение (возможно, перечисление) для ваших объектов, которое представляет их, и сравнить с этим.

0 голосов
/ 02 сентября 2011

Если вы хотите быть действительно быстрым и доверять коду, который вам звонит, измените индексатор, чтобы просто взять int.Затем в любом методе (который вы не показали), который используют вызывающие, чтобы добавить типы в список, верните им соответствующий тип int.Это хуже API, но это означает, что вам не нужно делать какие-либо циклы или поиск.

0 голосов
/ 02 сентября 2011

Вы можете хранить значения в словаре, проиндексированном по типу, а не списку, чтобы вам не приходилось каждый раз выполнять O (n) -терацию по списку.

Как отмечено в комментариях, это зависит от размера n и может быть микрооптимизацией. Я бы рекомендовал профилировать ваше приложение.

...