2016-01-31 3 views
3

Документы recommend для регистрации часто используемых компонентов через лямбду как ...Почему лямбды разрешаются быстрее?

Это может дать улучшение до 10 раз быстрее Resolve() звонков

Теперь, очевидно, есть несколько вопросов:

  1. Почему? (EDIT: уточнить: я бы понял, если зарегистрировать время, потому что вам нужно использовать отражение сейчас, чтобы найти правильный конструктор и т. Д., Но почему стоит время разрешения?)
  2. В каких сценариях это делается применить/какие аспекты зарегистрированного класса сделать этот номер вверх /, который заставляет его идти вниз?
  3. В какое время решения мы вообще говорим о любом случае? Как «да, теперь требуется 100 вместо 10 циклов процессора» или фактически измеримых чисел в «обычных» случаях использования (веб-сервис с продолжительностью жизни каждого запроса)?
+0

Конкретные реализации всегда быстрее, чем дженерики или отражение. При общем использовании в фоновом режиме используется много отражений. И это медленнее. В большинстве случаев вы не можете почувствовать разницу. Вы можете просто испортить это.Использование с использованием тяжелых кодов, таких как алгоритмы, часто следует избегать отражения или дженериков из-за замедления. Но: «преждевременная оптимизация - это корень всего зла». Сделай так, чтоб это работало. Затем заставьте его работать быстро, если необходимо. – Ben

+0

@Ben да, я знаю об этом, но я бы предположил, что эта стоимость приходится на время регистрации, а не на время решения (потому что как только я нашел правильный конструктор, который может быть выполнен во время регистрации, я могу просто вызвать '' 'Activator .CreateInstance'''). Вот что меня смущает. – FrankyBoy

ответ

3

Как отмечается в комментариях, короткая версия заключается в том, что конкретная реализация будет быстрее, чем отражение решения.

Дайвинг глубже, подумайте о шагах, участвующих в каждом.

Лямбда:

  1. Выполнить метод.
  2. Нет второго шага.

Отражение:

  1. Перечислить все конструкторы типа, чтобы быть создан. Этот список можно кэшировать, но он довольно хорошо кэшируется платформой .NET.
  2. Из всех доступных конструкторов выяснить, какой из них выполнить, исходя из количества доступных параметров конструктора и типов, зарегистрированных в контейнере. Обратите внимание, что типы, зарегистрированные в контейнере , могут быть изменены на основании источников регистрации, регистрации сроков действия и т. Д.
  3. Решите параметры конструктора. Если есть учетные записи, основанные на отражении, которые составляют параметры конструктора, запустите их через этот процесс рекурсивно.
  4. Вызов выбранного конструктора с использованием разрешенных параметров.

Как вы можете видеть, на самом деле гораздо больше работы, чем просто Activator.CreateInstance в манере разрешения отражения, поэтому это занимает больше времени.

Но, как также отмечено в комментариях, не беспокойтесь о преждевременной оптимизации. Это все происходит довольно быстро, поэтому подождите, пока вы не сможете найти узкое место, используя профайлер или какой-то подобный инструмент.

+0

Привет! Спасибо за этот замечательный ответ. Учитывая пункт 2, выясняется, почему происходит больше работы и почему это невозможно сделать во время регистрации. Что касается 3 ->, что также относится к лямбдам, конечно, если вам нужно что-то разрешить;) – FrankyBoy

+0

О, и в отношении преждевременной оптимизации: не стоит беспокоиться, я просто пытаюсь немного погрузиться в autofac (потому что мы используем это отстой), наткнулся на это и просто любопытно. У нас гораздо больше областей, чтобы беспокоиться о первых достижениях. – FrankyBoy

Смежные вопросы