Проблемы производительности от внедрения зависимости

Онлайн:

# Assuming your `df` doesn't have target in the first place
df['target'] = 0
df.loc[df[df.flag==1].drop_duplicates('date').index, 'target'] = 1
7
задан Bjorn Reppen 7 January 2009 в 15:30
поделиться

6 ответов

Это кажется мне как Вы, должен усилить функции, которые надлежащая платформа внедрения зависимости может дать Вам. Не используйте другую логику конструкции для тестирования/производства.

С пружиной одноэлементные инжекции только выполняются при контейнерном запуске. Опытные инжекции сделаны каждый раз. Полное проводное соединение также сделано каждый раз, когда Вы выполняете модульный тест, если оно соединяется проводом. Так профильные модульные тесты обычно не хорошая идея.

Возможно, Вы используете слишком мало одноэлементных объемов и слишком большого опытного объема? (Прототип = новый экземпляр каждый раз)

Хорошая вещь о пружинной инжекции состоит в том, что можно использовать прокси объема, подразумевая, что граф объектов может быть похожим на это:

 A Singleton
 |
 B Singleton
 |
 C Prototype (per-invocation)
 |
 D Singleton
 |
 E Session scope (web app)
 |
 F Singleton

И каждый запрос только создал бы 1 экземпляр C и один экземпляр E на сессию. A, B, D и F являются одиночными элементами. Если это не веб-приложение, у Вас нет объема сессии по умолчанию, но можно также сделать пользовательские объемы (объем "Окна" звучит прохладным для оконного настольного приложения). Подсказка здесь - то, что можно "представить" объемы на любом уровне, эффективно у Вас может быть десять слоев одноэлементных объектов и внезапно чего-то, что ограниченная по объему сессия разоблачает. (Это может действительно коренным образом изменить, как Вы реализуете некоторые сквозные опции в многоуровневой архитектуре, но это - другая история),

Это действительно дает минимальное создание объекта, возможное в рамках модели DI, я думаю.

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

8
ответ дан 6 December 2019 в 21:21
поделиться

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

class ShortLivedThing {
   IDependency1 dep1;
   IDependency1 dep2;
   IDependency1 dep3;
   ...

   int TheRealData;

   public ShortLivedThing(IDependency1 d1, IDependency2 d2, IDependency3 d3) { 
     dep1 = d1; dep2 = d2; dep3 = d3;
   }
}

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

Таким образом: не идите для 50% DI / 50%-е жесткое кодирование, идите для 100% DI.

2
ответ дан 6 December 2019 в 21:21
поделиться

Если Ваше беспокойство является медленными тестами, попытайтесь выполнить их параллельно и не позволяйте процессу тестирования прервать Ваших программистов.

Автоматизируйте этот процесс:

  • Когда кто-то зарегистрируется, сделайте сборку из репозитория.
  • Запустите тесты на этой сборке.
  • E - Отправьте результаты по почте разработчику, который зарегистрировался.

Лучше, если первая регистрация не сделана в фактический репозиторий. Доберитесь до временного и сделайте сборку из этого. Дополнительно можно выполнить тесты производительности, проверки стиля и т.д. и включать их в e - почта. Если Вы делаете это, добавьте один шаг к автоматизированному процессу:

  • Если тесты передают (и дополнительные критерии встречен), объедините новый код с фактическим репозиторием.

Таким образом, медленные тесты не являются никаким беспокойством. Также, когда разработчик должен знать, повредил ли ее код что-то или заставил производительность повысить, она ожидала, она просто регистрируется и ожидает e - почта, сгенерированная для нее.

1
ответ дан 6 December 2019 в 21:21
поделиться

Как насчет того, чтобы передать в ссылках?

1
ответ дан 6 December 2019 в 21:21
поделиться

Лучшее, которое я могу придумать, должно поместить все зависимости в один объект "контекста", который является затем общим для все экземпляры. Это должно смягчить проблему производительности несколько.

0
ответ дан 6 December 2019 в 21:21
поделиться

Если Вы нацелены на.NET, проверяете Autofac. Это имеет различные объемы (одиночный элемент, фабрика, контейнер) для тонкой настройки аспектов создания, детерминированное распоряжение для держания использования ресурсов в страхе и позволяет использовать GeneratedFactories и лямбда-выражения, чтобы настроить компоненты и избежать стоимости отражения.

0
ответ дан 6 December 2019 в 21:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: