Эффективность запуска впрыска

Недавно мне было предложено устранить некоторые проблемы с производительностью в приложении, созданном с помощью приложения Microsoft Composite UI Application, в частности, что он слишком долго загружался.

Это построено вокруг рамки интеграции зависимостей Microsoft ObjectBuilder, которая использует отражение/атрибуты для регистрации классов. Профилирование показало, что при запуске приложение тратило значительное количество времени на размышления, поскольку ObjectBuilder сканирует каждый тип в каждой загруженной сборке в нем для поиска вещей для регистрации.

Альтернативные рамки DI, похоже, также используют атрибуты, конфигурацию XML или чистый код.
Кажется, что никакая из других инфраструктур, основанных на атрибутах, не будет лучше, и я скептически отношусь к временам запуска, когда груды XML должны быть проанализированы и т.д.

Чистые основанные на коде основанные фреймворки кажутся, что они должны быть намного быстрее, но тогда они также намного менее гибкие, поэтому на самом деле не кажется, что есть четкий хороший выбор...

Это привело меня к поиску контрольных показателей контейнера DI, но единственное, что я смог найти, это следующее: http://www.codinginstinct.com/2008/04/ioc-container-benchmark-unity-windsor.html. < ш > Хотя это отличный ориентир, он определяет только то, как быстро вы можете создать 1 миллион объектов с помощью контейнера. Я не заинтересован в создании 1 миллиона объектов, я просто хочу, чтобы приложение запускалось как можно быстрее, поэтому я ищу любую информацию о расходах на запуск DI Container, будь то сообщения в блоге, анекдоты или даже что-то вроде просто как "здесь способ сделать ObjectBuilder быстрее".

Заранее спасибо

Ответ 1

Вы пытались измерить время запуска, когда все сборки были NGEN'd? Я нашел (по крайней мере, в IronScheme), что он помогает много (в моем случае от 1,5 сек до 0,1 сек) в сценариях отражения.

Ответ 2

При ускорении...

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

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

Ответ 3

Я не знаю об ObjectBuilder, но последние среды вложения зависимостей обычно поддерживают ленивую загрузку, чтобы улучшить производительность запуска. Например, см. Lazing Around с Autofac2.

Или вы можете сделать это вручную, как в примере Ploeh LazyOrderShipper.