Проблемы с производительностью при использовании AOP для проекта .net - PullRequest
4 голосов
/ 15 января 2011

Я обеспокоен влиянием производительности на использование PostSharp и Spring.NET в большом проекте .net (с примерно полмиллионом активных пользователей).

В основном я хочу что-то вроде этого: я не хочусоздать журнал для полмиллиона раз, когда я создаю пользовательский отчет.Но когда пользователь использует систему, я хочу записать некоторые его / ее действия.Большинство инструментов АОП просто не обладают такой гибкостью.

Есть ли способ прикрепить аспекты к отдельным объектам?Или включить или выключить аспект во время выполнения?

Ответы [ 4 ]

1 голос
/ 15 января 2011

aop-logging-questions Производительность зависит от того, как это делается.

Полагаю, вы хотите включить в свой код советы по ведению журнала. dynamic aop возможно только

  • для виртуальных методов и
  • для интерфейсов.

Так что, вероятно, вам нужно время компиляцииАОП .

Я не знаю, как пост-диез делает AOP.с компиляцией linfu-aop каждый метод получает предварительное и последующее выполнение, где динамически определяется, выполняются ли и какие аспекты aop.этот трюк фактически удаляет ограничения на не виртуальных методах, делая их псевдовиртуальными.

Я предпочитаю делать manuall (= non-aop -) ведение журнала с помощью common.logging , который использует провайдера log4.net.Это решение имеет минимальное время выполнения, если ведение журнала отключено .Включение / отключение ведения журнала может быть выполнено выборочно без перекомпиляции - это всего лишь конфигурационный файл, который может сказать «вся активность уровня данных с sql», но не «sql в модуле xyz».

дорогостоящий анализ трассировки стека (какой класся и вход в систему или для меня в отладке / трассировке, Info, ....) выполняется только один раз для каждого класса.

Отключенные журналы могут быть перенесены в одну дешевую переменную Boolen оценки плюс один, если.Эта скорость для оптимизации размера может обрабатываться синтаксисом

logger.Debug(m => m("... costly string formatting "));

, который скомпилирован в нечто похожее на

if (logger.IsDebugEnabled) 
     call anonymous method that does 
        the expensive string formatting
1 голос
/ 16 января 2011

Насколько я понимаю для PostSharp и Spring.NET, вы определяете свои аспекты, метки или что-то еще для своего класса во время разработки. Вы мало что можете сделать, когда используете объект класса с точки зрения включения или выключения аспектов, смены точек и т. Д.

Вы получаете то, что вы определили во время разработки класса. Неважно, используете ли вы один объект или миллион объектов класса. Вы должны быть очень осторожны, чтобы использовать их. В противном случае вы можете выстрелить себе в ногу.

Что вам действительно нужно, так это инструмент AOP, который обращается к аспектам на уровне объекта, а не на уровне класса. Есть статья Добавление аспектов к объекту с использованием динамического декоратора .

Для меня Аспекты - это системные требования. Системные требования - это эксплуатационные требования, которые лучше всего решать на уровне объектов во время выполнения, когда объекты используются.

Если честно, я не понимаю, почему большинство инструментов AOP пытаются удовлетворить системные требования на уровне класса в нужное время. Это может объяснить, почему их усыновление все еще так ограничено после стольких лет.

0 голосов
/ 26 ноября 2016

Я активно работаю над NConcern .NET AOP Framework , новым проектом с открытым исходным кодом с хорошей производительностью. Эта AOP Framework во время выполнения может внедрять код не виртуальным методом (включая статический) и может быть присоединена или отключена во время выполнения.

Большинство существующих платформ AOP основаны на одной и той же технике перехвата.

  • Proxy (декоратор с отражением) или ContextBoundObject / RemotingRealProxy для реализации во время выполнения
  • Перезапись IL на посткомпиляции для времени компиляции AOP Frameworks.

Вот почему это простой способ сделать вывод об ограничениях и производительности реализаций Runtime vs Compile-Time.

Однако это не является фатальным, и AOP Framework может быть реализован с использованием эксклюзивной техники инъекций и современного пользовательского API, что делает его очень простым в использовании и эффективным.

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

Пожалуйста, посмотрите, меня интересует ваше мнение по этому вопросу. Это может помочь мне улучшить продукт.

0 голосов
/ 15 января 2011

Производительность PostSharp и Spring.NET нельзя обсуждать вместе.PostSharp использует ткачество во время компиляции, а Spring.NET - ткачество во время выполнения.Это означает, что PostSharp добавляет накладные расходы AOP только во время компиляции и Spring.NET только во время выполнения - прочитайте некоторые статьи из SharpCrafters , чтобы получить больше информации.

О прикреплении аспектов - одна из ключевых функцийАОП являются точечными.Pointcuts можно рассматривать как предикаты, которые выбирают, включать ли аспект для данного типа / метода и т. Д. Таким образом, вы всегда можете создать структуру типов и pointcuts, чтобы использовать аспект ведения журнала только в определенных точках вашей системы - именно так работает AOP.

О включении / выключении аспектов во время выполнения - для PostSharp, который скомпилирован в ваш код, я считаю, что это невозможно без каких-либо хитростей.Для Spring.NET это будет проще, но все же я не вижу смысла, зачем вам это нужно.

...