Подтвердить что ты не робот

Эффективное влияние использования aop

Мы начали использовать spring aop для сквозных аспектов нашего приложения (безопасность и кэширование на данный момент).

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

В моем вопросе возникли проблемы с производительностью, связанные с использованием aop (в частности, spring aop)?

4b9b3361

Ответ 1

Пока вы контролируете свой АОП, я считаю его эффективным. В любом случае у нас были проблемы с производительностью, поэтому по собственным соображениям мы не полностью контролировали;) Это было главным образом потому, что важно, чтобы любой, кто пишет аспекты, полностью понимал все другие аспекты системы и то, как они взаимосвязаны. Если вы начнете делать "умные" вещи, вы можете перехитрить себя в один миг. Выполнение умных вещей в большом проекте с большим количеством людей, которые видят только небольшие части системы, может быть очень опасным с точки зрения производительности. Этот совет, вероятно, применим и без АОП, но AOP позволяет вам стрелять себе в ногу некоторыми изящными элегантными способами.

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

Но учитывая, что у вас есть контроль, единственной реальной точкой боли с AOP является эффект отладки.

Ответ 2

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

Поскольку он использует перекодирование байтовым кодом (время компиляции и время выполнения имеет большое значение), это одна из самых быстрых систем AOP. См.: AOP Benchmarks

Ответ 3

Когда я использовал его, я этого не сделал, но тогда мое приложение не является вашим приложением.

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

Я понимаю, что "измерение с вашим приложением", вероятно, не является ответом, который вы искали, но вполне возможно, что вы догадались, что получите:)

Ответ 4

Если вы используете AOP на основе прокси-сервера, вы говорите об одном дополнительном вызове Java-метода для каждого примененного аспекта. Влияние производительности там очень незначительно. Единственная реальная проблема заключается в создании прокси, но это обычно происходит только один раз при запуске приложения. В блоге SpringSource есть отличная статья:

http://blog.springsource.com/2007/07/19/debunking-myths-proxies-impact-performance/

Ответ 5

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

На практике AOP Framework может вводить 3 типа накладных расходов:

  • противопожарное время
  • механик перехвата
  • интеграция потребителей (способ выработки совета)

Для получения более подробной информации вы можете обратиться к когда-это-AOP-код-выполняется.

Просто будьте осторожны в том, как вы реализуете совет, потому что трансверсальный код - соблазн для упаковки/распаковки и отражения (дорогой с точки зрения производительности).

Без AOP Framework (жестко увязывающего ваши межсекторальные задачи) вы сможете легче разрабатывать предполагаемые советы (выделенные для каждой процедуры) без упаковки/распаковки и отражения.

Вы должны знать, что большинство AOP Framework не предлагают способ полностью избежать упаковки/распаковки и отражения.

Я разработал один, чтобы ответить на большинство недостающих потребностей, сосредоточенных на 3 вещах:

  • удобный (легкий, легкий в освоении)
  • прозрачный (без взлома кода для включения)
  • эффективный (без упаковки/распаковки, без отражения в номинальном коде пользователя и хорошей механикой перехвата)

Вы можете найти мой проект с открытым исходным кодом здесь: Puresharp API.net 4.5. 2+ ранее NConcern.NET AOP Framework

Ответ 6

Я использовал spring AOP в пакетном процессе в моем текущем проекте для транзакции, управляющей базой данных.

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

Я бы сказал, что aop - отличная система для использования, но попытайтесь принять к сведению, сколько вызовов методов добавлено в ваше приложение

Ответ 7

Вы когда-нибудь думали об инструментах AOP, которые добавляли аспекты к объекту во время выполнения, когда вам нужно? Существует один для .net "Добавить аспекты к объекту с использованием динамического декоратора" (http://www.codeproject.com/KB/architecture/aspectddecorator.aspx). Я считаю, что вы можете написать аналогичную для Java.

Ответ 8

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