Производительность запуска зависимостей - PullRequest
10 голосов
/ 22 января 2009

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 22 января 2009

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

0 голосов
/ 22 декабря 2010

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

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

0 голосов
/ 22 декабря 2010

Как сделать это быстрее ...

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

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

...