2014-09-27 2 views
0

У нас есть большое веб-приложение, которое использует Виндзорский замок в течение многих лет. Приложение имеет около 700 регистраций компонентов более 370 сервисов. Почти все они принадлежат корню, а именно контроллеру точки входа. Когда приходит веб-запрос, мы разрешаем этот контроллер ввода и позволяем ему обрабатывать запрос. Проблема в том, что решение корневого компонента занимает около 35 миллисекунд. Я бы сказал, это звучит довольно много для меня.Виндзорский замок 3.2 разрешает работу

Вопрос в том, соответствует ли число выше нормального звучания? Может ли кто-нибудь бросить мне подсказку о том, что я могу сделать, чтобы улучшить время решения? Или проверить, что я делаю что-то неправильно?

Спасибо :)

+0

Как вы измерили это? Вы сравнивали это, компилировавшись в режиме RELEASE и запуская отладчик OUTSIDE? – Steven

+0

Да, я использовал StopWatch для измерения времени, необходимого для разрешения и записи прошедшего времени в журнал. В режиме выпуска и вне отладчика наверняка. – Thuan

ответ

2

Сколько времени требуется, чтобы решить объектный граф зависит от многих факторов, таких как:

  • Размер объекта графа
  • Зарегистрированные образы жизни компонентов и расположение этих образов жизни на графике (очевидно, если корневой объект является одиночным, разрешение действительно быстрое)
  • Объем работы, которую вы выполняете в своих конструкторах

Так что без дополнительной информации не так уж много говорить. Однако я бы сказал, что 35 мс. довольно много, даже для замка Виндзор. Я провел небольшой тест по 6 наиболее используемым контейнерам DI при разрешении объектного графика из 881 переходных компонентов, а самый медленный контейнер (Ninject) занял 5 мс, тогда как самый быстрый контейнер (Simple Injector) занял 0,01 мс (на моей машине), чтобы решить эту проблему граф.

Container  | ms. 
----------------+----- 
Simple Injector | 0.01 
StructureMap | 0.50 
Autofac   | 0.77 
Unity   | 1.04 
Castle Windsor | 3.96 
Ninject   | 5.03 

Из этого теста я бы сказал, что 35 мс. немного медленнее для разрешения графа объекта с этим размером с Castle Windsor. Поэтому убедитесь, что your injection constructors are simple, и вы ничего не делаете, кроме проверки нулевого и сохранения входящих зависимостей. Таким образом вы можете compose your object graphs with confidence.

btw, вы можете найти более обширный ориентир here.

+0

Спасибо. Ваш ответ действительно дает мне полезные подсказки. Я проверю свою кодовую базу и вернусь позже :) – Thuan

+0

Некоторые из наших компонентов должны создавать контексты объектов Entity Framework. Мы также используем дочерний контейнер для подключения большего количества компонентов для каждого запроса, который добавляет еще несколько миллисекунд. Все остальные конструкторы мне не дорогие. Моя приблизительная оценка заключается в том, что все эти тяжелые операции отвечают за максимум 50% необходимого времени. В результате кажется, что собственный код Windsor занимает около 20 мс, что по-прежнему много. – Thuan

+0

@Thuan: Если это слишком много, переключитесь на более быстрый контейнер. – Steven

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