Комментарии 30
Вот что значит отсутствие анонимных функций и ФВП.
С ними это решается так (с точностью до синтаксиса конкретного языка):
С ними это решается так (с точностью до синтаксиса конкретного языка):
time fmt act = do
t <- getCurrentTime
finally act $ do
t2 <- getCurrentTime
printf fmt $ show $ fromEnum $ (utctDayTime t2 - utctDayTime t) / 1e9
start = time "method time: %s ms" $ do
threadDelay 1000000
-9
Автор написал, как поменять N объявлений методов, чтобы, добавив или убрав десяток символов к ключам компилятора, получить данные профайлинга.
Вы (если я правильно понимаю этот псевдокод) написали, как поменять M*N точек вызова методов, загадив код сообщениями профайлинга.
По-моему, Вы решили какую-то другую задачу. Нет?
Вы (если я правильно понимаю этот псевдокод) написали, как поменять M*N точек вызова методов, загадив код сообщениями профайлинга.
По-моему, Вы решили какую-то другую задачу. Нет?
+10
Нет, автор предлагает к определению методу дописать
А я предлагаю дописать туда же (не к вызову, хотя и это возможно, т.е. ещё один вариант использования, при этом выглядящий так же):
По-моему, я решил ту же задачу 5-ю строками.
Судя по плюсам вам и минусам мне, остальные даже в моём коде не разобрались, но выразили «мнение». Хоть вам спасибо, что словесно.
@Time(format="method time: %s ms")
А я предлагаю дописать туда же (не к вызову, хотя и это возможно, т.е. ещё один вариант использования, при этом выглядящий так же):
time "method time: %s ms" $
По-моему, я решил ту же задачу 5-ю строками.
Судя по плюсам вам и минусам мне, остальные даже в моём коде не разобрались, но выразили «мнение». Хоть вам спасибо, что словесно.
0
Ну, действительно интересная идея. Если нужно померить время выполнения метода, то проще чем аннотация, наверное и не придумать. А Perf4J позволяет «мерить» и нужные кусочки кода внутри методов.
Ну кстати, это еще и пример того, как создать свою аннотацию. Молодец, автор!
Ну кстати, это еще и пример того, как создать свою аннотацию. Молодец, автор!
0
Небольшой недостаток AOP в том, что необходимо подключать дополнительные библиотеки. А aspectj.jar весит примерно 12 мегабайт.
0
Насколько я понимаю, в java нельзя сделать аннотацию на блок кода внутри метода.
А так можно было бы сделать что-то вроде @Time { longOperation(); } или @Time for(;;) {}
А так можно было бы сделать что-то вроде @Time { longOperation(); } или @Time for(;;) {}
0
Да, спасибо за пример. Для себя нашёл полезное!
Пишите ещё!
Пишите ещё!
+1
Интересная реализация, возьму на заметку с Вашего разрешения :)
Но комментарии в коде не помешали бы, а? ;)
Но комментарии в коде не помешали бы, а? ;)
+1
Полезная вещь, если нет возможности пользоваться профайлером
0
А можно сделать так, что бы когда в рантайм-класспассе есть annotations.jar — то профилирование включено, а когда её нет — то оно отключено(и без всяких classnotfoundexception)?
(Там возможно понадобится порезать annotations.jar на 2 либы annotations-api.jar и annotations-logger.jar)
(Там возможно понадобится порезать annotations.jar на 2 либы annotations-api.jar и annotations-logger.jar)
+1
Правильно ли я понял что код работает на 1.6+?
+3
Да, похоже это всё появилось только в 1.6.
В 1.5 моя аннотация игнорируется.
В 1.5 моя аннотация игнорируется.
0
Да, эта реализация использует «Pluggable Annotation Processing API» появившийся в 1.6. =( *CRY*
Тем не менее автору уважение, я проникся.
Тем не менее автору уважение, я проникся.
0
Интерес представляет compile-time weaving, дающий возможность профайлить private методы. Обычным проксированием такого не добьешься. По поводу аннотаций: лично я бы использовал их лишь как маркер, т.е. без параметров (есть аннотация — профайлить, нет — не профайлить), а формат выводимых сообщений определял где-нибудь в конфиге (не в коде!). Это позволит легко генерить суммарную статистику в дальнейшем — количество вызовов метода, среднее время, минимальное, максимальное и т.д. Какой смысл в произвольном формате для каждого метода? Как потом этим пользоваться?
Кстати perf4j все это уже умеет давно и прекрасно используется при разработке проектов, поэтому ИМХО автору стоило акцентировать внимание на новой фиче java 6, а не на профайлинге. «Все украдено до нас» ;)
Кстати perf4j все это уже умеет давно и прекрасно используется при разработке проектов, поэтому ИМХО автору стоило акцентировать внимание на новой фиче java 6, а не на профайлинге. «Все украдено до нас» ;)
+2
для меня этот уровень уже магия.
0
> Наша аннотация будет считать время выполнения метода
Вы уж извините, но это звучит абсолютно безграмотно. Аннотация сама по себе ничего не может считать. Аннотации — лишь метаинформация, метаданные. Вы сами это прекрасно знаете, но читателей (новичков) вводит в заблуждение, как будто действительно какая-то магия происходит.
Вы уж извините, но это звучит абсолютно безграмотно. Аннотация сама по себе ничего не может считать. Аннотации — лишь метаинформация, метаданные. Вы сами это прекрасно знаете, но читателей (новичков) вводит в заблуждение, как будто действительно какая-то магия происходит.
+1
Плюсую в топик и в карму. Для меня использование аннотация для профайлинга не очень интересно, т.к. JProfiler-a хватает вполне, но вот сам пример нетривиального использования pluggable annotation processor'a, модифицирующего код — очень интересен. В который раз убеждаюсь, что в недрах com.sun.* лежат сокровища :)
0
Отличная статья, именно то, что искал для своего проекта
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Подсчёт времени выполнения метода через аннотацию