Статическое отражение производительности - PullRequest
9 голосов
/ 15 августа 2011

Я играю о коде статического отражения из блога Джоэла Абрахамссона и блога Даниэля Каззулино .Но я обнаружил, что их производительность довольно медленная, даже если сравнивать с обработкой с использованием «волшебной струны».

int iterations = 1000000; 
watch.Start();

for (int i = 0; i < iterations; i++)
{
    var propertyOfName = Reflect<Employee>.GetProperty(c => c.Name); 
}

watch.Stop();
Console.WriteLine("[Reflector]: " + watch.ElapsedMilliseconds.ToString());
watch.Reset();
watch.Start();

for (int i = 0; i < iterations; i++)
{
    var propertyName = typeof (Employee).GetProperty("Name"); 
}

watch.Stop();
Console.WriteLine("[Regular Reflection]: " + watch.ElapsedMilliseconds.ToString());
watch.Reset();
watch.Start();

for (int i = 0; i < iterations; i++)
{
    var propertyName = StaticReflection.GetMemberName<Employee>(c => c.Name);
}

watch.Stop();
Console.WriteLine("[StaticReflection]: " + watch.ElapsedMilliseconds.ToString());

Вот результат:

  • [Отражатель]: 37823
  • [Обычное отражение]: 780
  • [Статическое отражение]: 24362

Так почему же мы предпочитаем статическое отражение?Просто удалить "волшебную строку"?Или мы должны добавить кеширование для улучшения производительности статического отражения?

Ответы [ 2 ]

4 голосов
/ 15 августа 2011

Основная причина «предпочтения» - это статическая проверка типов компилятором, чтобы убедиться, что вы не напутали (и, к примеру, чтобы она работала, если вы запутываете). Однако, IMO, это настолько редко, что опечатка здесь является значимой ошибкой (что означает: я не включаю опечатку с мертвым мозгом, которую вы обнаружите и исправите во время разработки / юнит-тестирования); поэтому (так как я гайка производительности), я обычно советую использовать самый простой вариант (string). Пример конкретного - это когда люди реализуют интерфейс INotifyPropertyChanged, используя подобные приемы. Просто передайте string; p

2 голосов
/ 20 февраля 2013

Вы видели http://ayende.com/blog/779/static-reflection? Он использовал только делегаты (не деревья выражений) и улучшил сравнение с обычной производительностью Reflection.

Пример реализации

 public static MethodInfo MethodInfo<TRet, A0>(Func<TRet, A0> func0)
{
        return func0.Method;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...