2014-12-02 2 views
1

У меня есть требование регистрировать время выполнения каждого отдельного метода в приложении к БД с использованием logback и AspectJ. Это корпоративное приложение с примерно несколькими тысячами классов и в среднем около 10 методов внутри каждого класса.Производительность: использование AspectJ для регистрации времени выполнения всех методов

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

ответ

2

Тысячи классов с примерно десятью методами для каждого класса, и вы должны внедрить протоколы слежения за всеми из них?

Короткий ответ: Да.

Долгосрочный ответ: Ад да.
Ваш результат будет (более или менее) сильно затронут. Чтобы регистрировать время выполнения методов, вам понадобится (минимально) совет, который занимает время при входе и выходе метода, строит строку и отправляет ее в структуру ведения журнала. В зависимости от того, что делают ваши десятки тысяч методов, для многих из них, которые могут быть еще более трудоемкими, чем фактическое выполнение метода, - чем меньше метод, тем выше накладные расходы.

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

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

+1

Но было бы нелегко вести журнал вручную с помощью разбросанных записей журнала. Самое замечательное в AspectJ заключается в том, что вы можете (de) активировать аспект по желанию, используя 'if()' pointcut даже динамически во время выполнения. Вы также можете создать абстрактный базовый аспект, который выполняет всю магию трассировки, а затем расширяет несколько конкретных суб-аспектов, переопределяя абстрактный pointcut, который фактически определяет, какой тип целей вы хотите перехватить. Таким образом, вы можете подготовиться к нескольким сценариям ведения журнала, трассировки, профилирования или отладки. Я просто люблю это делать с AspectJ. – kriegaex

+1

BTW, для поиска узких мест производительности по требованию, имеются специализированные инструменты профилирования (один из них даже включен в JDK), который может динамически подключаться к запущенному приложению и производить гораздо меньше накладных расходов, чем отчеты журнала, поскольку данные собираются на более низком уровне JVM и отображение их не является частью приложения, а профилировщика. Для последовательного ведения журнала, AspectJ - это ваш инструмент, хотя, если вы всегда хотите проверять время выполнения. Снижение производительности - это всего лишь вопрос детализации. Вызовите требование регистрации каждого звонка, это не имеет смысла. – kriegaex

+0

Мой ответ может дать некоторый потенциал для недоразумений, поскольку он пытается удержать вопрос о влиянии производительности. Я не сказал, что, несмотря на влияние производительности, это все же * лучший * метод достижения цели OP. Я по-прежнему использую и разрабатываю свой трассировочный аспект, и мне нравятся возможности - хотя я выбрал другой (менее эффективный) способ (de), активирующий его во время выполнения: поскольку все протоколирование происходит через logback, аспект использует свой собственный маркер и может быть активирован и дезактивируется во время работы через TurboFilter, примененный к протоколированию. – sheltem

Смежные вопросы