GetMember против производительности GetField в C # - PullRequest
0 голосов
/ 23 марта 2012

Кто-нибудь знает, что лучше всего использовать для чтения XmlEnumAttribute

Вариант 1: с GetMember

    public static string XmlEnum(this Enum e)
    {
        Type type = e.GetType();
        MemberInfo[] memInfo = type.GetMember(e.ToString());
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(XmlEnumAttribute), false);
            if (attrs != null && attrs.Length > 0)
            {
                return ((XmlEnumAttribute)attrs[0]).Name;
            }
        }
        return e.ToString();
    }

Вариант 2: С GetField

    public static string XmlEnum2(this Enum e)
    {
        Type type = e.GetType();
        FieldInfo info = type.GetField(e.ToString());
        if (!info.IsDefined(typeof(XmlEnumAttribute), false))
        {
            return e.ToString();
        }
        object[] attrs = info.GetCustomAttributes(typeof(XmlEnumAttribute), false);
        return ((XmlEnumAttribute)attrs[0]).Name;
    }

1 Ответ

6 голосов
/ 23 марта 2012

Почему бы не попробовать 100 000 раз и посмотреть, сколько времени это займет в каждом конкретном случае?

Потому что это не проверяет реалистичный сценарий использования атрибута.Это дорого первый раз, когда вы выкапываете атрибут, дешево после этого.Расходы заключаются в загрузке IL для класса атрибута и его компиляции, нахождении данных атрибута в метаданных сборки и загрузке их с диска.Затем вызывая конструктор атрибута и назначая свойства атрибута.Стоимость вашего кода для чтения атрибута по сравнению с ним арахисовая, это дисковый ввод-вывод, который стоит на несколько порядков дороже.Во второй раз, когда вы извлекаете атрибут, большая часть этой работы выполняется, и это будет быстро, только инициализация объекта из данных, которые кэшируются.

Обычно атрибут считывается только один раз, может быть, несколько раз.Таким образом, в первую очередь стоит дорого, код, который вы используете, имеет очень мало значения.Идите вперед и профилируйте это.Просто убедитесь, что вы не рассматриваете этот дорогой первый раз как «экспериментальную ошибку».

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