Есть ли способ сделать эту функцию "GetPropertyName" быстрее? - PullRequest
4 голосов
/ 07 марта 2011

В настоящее время я использую дерево выражений для получения имени свойства.

public static string GetPropertyName<T, TReturn>(Expression<Func<T, TReturn>> expression)
{
     MemberExpression body = (MemberExpression)expression.Body;
     return body.Member.Name;
}

Я видел где-то, где они использовали строковую версию (expression.toString ()) выражения для его кешированияв словаре, а затем получить имя свойства во второй раз из кэша.

Это действительно помогает или есть лучший способ?

Ответы [ 2 ]

3 голосов
/ 08 марта 2011

Это зависит от того, что вы подразумеваете под словом «это помогает».

Идея такого кэширования заключается в том, что это будет быстрее, чем проверка выражения.Моя первая реакция на это - «это, вероятно, будет еще медленнее», но в 99% случаев такие интуитивные догадки ошибочны, поэтому давайте просто пока проигнорируем это.

Кэширование - это компромисс.Вы будете вводить накладные расходы памяти (для словаря) и затраты времени на создание словаря в надежде , что операция поиска в словаре ToString plus будет достаточно быстрой, чем проверка того выражения, которое стоитзатраты (плюс повышенная сложность).Даже если это правда, более быстрый поиск не будет иметь значения вообще , если вы не делаете это где-то в большом цикле.Это правда в вашем случае?Если нет, то вам не стоит беспокоиться.

Теперь, если бы вы писали библиотеку общего назначения, вы бы не знали, как пользователи этой библиотеки решили использовать ее.Возможно, некоторые из них действительно будут делать такие вызовы в цикле.В этом случае может быть хорошей идеей прикрыть спину и попробовать кэшировать; но все же было бы плохим решением внедрить кэширование для маловероятного сценария, если это сделает ваш более вероятный сценарий хуже .

И, конечно, оценка того, будет ли кэшированиелучше или хуже всегда следует делать измеряя .

2 голосов
/ 16 марта 2011
* Отражение

: уклонение от общих ловушек производительности для создания скоростных приложений

http://msdn.microsoft.com/en-us/magazine/cc163759.aspx

Функции быстрого и светлого отражения

  • TypeOf
  • Object.GetType
  • typeof == Object.GetType
  • API эквивалентности типов (включая перегрузки операторов дескриптора)
  • get_module
  • get_MemberType
  • Некоторые из API предикатов IsXX
  • Новые API разрешения токена / дескриптора в .NET Framework 2.0

дорогостоящие функции отражения

  • API GetXX (MethodInfo, PropertyInfo, FieldInfo и т. Д.)
  • GetCustomAttributes
  • Type.InvokeMember
  • API вызова (MethodInfo.Invoke, FieldInfo.GetValue и т. Д.)
  • get_Name (Имя свойства)
  • Activator.CreateInstance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...