2013-04-21 2 views
1

Я хочу измерить производительность различных функций в моем проекте. Это будет работать на несколько потоков, так что сейчас у меня есть что-то вроде этогоПользовательская аннотация Java для отслеживания производительности

long start = System.currentTimeMillis(); 
first(); 
StatsTracker.putTime("first", System.currentTimeMillis() - start); 
... 
start = System.currentTimeMillis(); 
second(); 
StatsTracker.putTime("second", System.currentTimeMillis() - start); 

Где StatsTracker является статическим классом, который просто отслеживает карту выступлений.

Я новичок в написании пользовательских аннотаций, и несколько учебников, которые я видел в Интернете, сделали его немного запутанным. То, что я хочу, в конце концов, что-то вроде этого

@StartTime("first") 
first(); 
@EndTime("first") 
... 
@StartTime("second") 
second(); 
@EndTime("second") 

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

Edit: Это может быть более естественным, чтобы иметь что-то вроде этого перед определением функции:

@TrackTime("first") 
public void first() { ... } 

Любая помощь приветствуется. Благодаря!

+1

IMHO, первый пример не только проще, но и быстрее, так как многие рамки AOP для поддержки аннотаций имеют накладные расходы. BTW Я бы использовал System.nanoTime() и разогрел код, т. Е. Отмерил первые 10 000 вызовов отдельно. –

ответ

3

Аннотации - это всего лишь метаданные. Они ничего не делают.

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

Такие рамки существуют (например, Jamon в сочетании с весенними бобами). Но писать один самостоятельно займет гораздо больше времени, чем делать то, что вы делаете сейчас, и, вероятно, заставит вас изменить способ разработки вашего приложения, чтобы использовать некоторую форму инъекции зависимостей. Или вам придется использовать байт-код с помощью AspectJ, например.

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

+0

А, ладно, я этого не осознавал. Я связывал аннотации Java с декораторами Python и надеялся, что они сделали что-то подобное: \ Спасибо за совет! – Jin

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