Доброго времени, уважаемый Хабражитель! Для смартфона особенно важна оптимальная архитектура приложений, поэтому я решил сравнить производительность бесплатных и открытых библиотек-контейнеров, доступных для Windows Phone. Вниманию удостоились следующие библиотеки (последние версии на момент тестирования): Автофак 2.5.2 Caliburn.Micro v1.3.1 (компонент SimpleContainer) Функ 1.0 МикроИок 1.0 Нинжект 2.2.1 TinyIoC Примечательно, что TinyIoC — это единственный файл исходного кода на C# (VB в разработке).
Его последняя версия требует небольшого исправления для WP7, иначе выдаст ошибку компиляции.
«System.Type» не содержит определения для «FindInterfaces», и не удалось найти метод расширения «FindInterfaces», принимающий первый аргумент типа «System.Type» (вам не хватает директивы using или ссылки на сборку?)Решается простой заменой строки
за строкуif (!registerImplementation.FindInterfaces((t, o) => t.Name == registerType.Name, null).
Any())
if (registerImplementation.GetInterface(registerType.Name, false) == null)
Все тесты проводились на реальном устройстве HTC Titan под управлением Windows Phone 7.5 в релизной конфигурации без подключенного отладчика и с полным зарядом аккумулятора.
Были объявлены три интерфейса и соответствующие им реализации.
Они были прописаны в тестируемом контейнере: первый — как синглтон (всегда один экземпляр), второй и третий — как временные (новый экземпляр создается при каждом обращении к контейнеру).
Первые две реализации имеют конструкторы без параметров, третья — конструктор с внедрением первых двух интерфейсов.
Каждый из интерфейсов был запрошен у контейнера 1 миллион раз.
Время измерялось с помощью секундомера в миллисекундах.
Результаты
Время в таблице представлено в миллисекундах.
При тестировании Ninject выяснилось, что время его ответа экспоненциально зависит от количества обращений к нему.
Около 10 тысяч временных разрешений объектов он обрабатывает сносно, но на полумиллионе практически умирает, просто останавливая приложение.
Поэтому мы были вынуждены сократить количество итераций в тесте для нее до десяти тысяч и пересчитать результат на миллион для сравнения с другими библиотеками.
Однако этот факт особого поведения Ninject следует иметь в виду при выборе контейнера.
Последняя колонка наиболее показательна, так как наиболее часто встречается на практике.
По одному обращению к контейнеру Ninject показал худший результат — почти одну миллисекунду.
У Funq лучший результат, что неудивительно, ведь.
это почти то же самое, что вызвать новый оператор.
Несмотря на высокую скорость работы, у Funq есть недостаток: при регистрации все зависимости придется прописывать вручную, что крайне неудобно, поскольку при обновлении конструктора объекта придется переписывать код регистрации.
Кстати, Autofac тоже предоставляет такой вариант регистрации, но он не изучен.
Чем выше полоска, тем больше времени требуется контейнеру для инициализации, тем хуже.
Конечно, производительность — не единственный критерий выбора того или иного контейнера для вашего проекта, поэтому вот еще пара таблиц с характеристиками изучаемых библиотек.
Выводы
Если вам нужен широкий функционал, то выбор очевиден – Autofac. Вы получите хорошую производительность, но за счет относительно большого размера файла библиотеки.Если вас устраивает наличие простых методов регистрации объектов и их извлечения из контейнера, то вам стоит обратить внимание на TinyIoC. Это небольшой и быстрый контейнер со стандартным функционалом.
SimpleContainer из набора Caliburn.Micro также показал хорошие результаты.
Но использовать его только ради контейнера не стоит; вам придется заплатить за это размером дистрибутива.
Однако если вы планируете использовать другие компоненты библиотеки, то выбор очевиден.
Теги: #WP7 #IoC #.
NET
-
Вконтакте Запустил Сервис Денежных Переводов
19 Oct, 24 -
Клиент Питерфм/Москвафм Про
19 Oct, 24 -
Легальность Музыкальных Сервисов
19 Oct, 24 -
Эксперт Строит «Антикаьеру»
19 Oct, 24