Как стать автором
Обновить

Комментарии 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
Автор написал, как поменять N объявлений методов, чтобы, добавив или убрав десяток символов к ключам компилятора, получить данные профайлинга.
Вы (если я правильно понимаю этот псевдокод) написали, как поменять M*N точек вызова методов, загадив код сообщениями профайлинга.

По-моему, Вы решили какую-то другую задачу. Нет?
Нет, автор предлагает к определению методу дописать
@Time(format="method time: %s ms")
А я предлагаю дописать туда же (не к вызову, хотя и это возможно, т.е. ещё один вариант использования, при этом выглядящий так же):
time "method time: %s ms" $
По-моему, я решил ту же задачу 5-ю строками.

Судя по плюсам вам и минусам мне, остальные даже в моём коде не разобрались, но выразили «мнение». Хоть вам спасибо, что словесно.
Наверное мало кто понял как это относится к java и java annotations
Хорошая идея.
Кстати есть open-source реализация подобной идеи: Perf4J, там аннотация получила имя @Profiled, а поддерживается через AOP
Ну, действительно интересная идея. Если нужно померить время выполнения метода, то проще чем аннотация, наверное и не придумать. А Perf4J позволяет «мерить» и нужные кусочки кода внутри методов.
Ну кстати, это еще и пример того, как создать свою аннотацию. Молодец, автор!
Небольшой недостаток AOP в том, что необходимо подключать дополнительные библиотеки. А aspectj.jar весит примерно 12 мегабайт.
aspectjrt.jar + aspectjweaver.jar = 2Mb
Хм. Это я на сайте aspecj посмотрел. Там предлагают скачать aspectj-1.6.8.jar (~12M). Видимо можно взять какой-то гораздо меньший кусочек =)
в aspectj-1.6.8.jar на сайте есть либы, доки, примеры. Они просто назвали файл не .zip, а .jar, что сбивает с толку
Насколько я понимаю, в java нельзя сделать аннотацию на блок кода внутри метода.
А так можно было бы сделать что-то вроде @Time { longOperation(); } или @Time for(;;) {}
Да, спасибо за пример. Для себя нашёл полезное!
Пишите ещё!
Интересная реализация, возьму на заметку с Вашего разрешения :)
Но комментарии в коде не помешали бы, а? ;)
Попробую дописать ;)
Полезная вещь, если нет возможности пользоваться профайлером
А можно сделать так, что бы когда в рантайм-класспассе есть annotations.jar — то профилирование включено, а когда её нет — то оно отключено(и без всяких classnotfoundexception)?

(Там возможно понадобится порезать annotations.jar на 2 либы annotations-api.jar и annotations-logger.jar)

В runtime библиотека не нужна. При компиляции в код программы вставляются нужные куски и всё.
Правильно ли я понял что код работает на 1.6+?
Да, похоже это всё появилось только в 1.6.
В 1.5 моя аннотация игнорируется.
Да, эта реализация использует «Pluggable Annotation Processing API» появившийся в 1.6. =( *CRY*
Тем не менее автору уважение, я проникся.
Если кто-нибудь знает где это всё подробно описано — напишите в комментариях, пожалуйста.
Мне пришлось изучать код библиотеки lombok (http://projectlombok.org/, интересная библиотека кстати) для того, чтобы разобраться.
Интерес представляет compile-time weaving, дающий возможность профайлить private методы. Обычным проксированием такого не добьешься. По поводу аннотаций: лично я бы использовал их лишь как маркер, т.е. без параметров (есть аннотация — профайлить, нет — не профайлить), а формат выводимых сообщений определял где-нибудь в конфиге (не в коде!). Это позволит легко генерить суммарную статистику в дальнейшем — количество вызовов метода, среднее время, минимальное, максимальное и т.д. Какой смысл в произвольном формате для каждого метода? Как потом этим пользоваться?
Кстати perf4j все это уже умеет давно и прекрасно используется при разработке проектов, поэтому ИМХО автору стоило акцентировать внимание на новой фиче java 6, а не на профайлинге. «Все украдено до нас» ;)
Это была первая пришедшая в голову простая задача :) Пойду изучать perf4j
Все правильно, именно так и сделан aspect для jboss. Профайлить можно либо по аннотациям, либо pattern на имя методов\классов\пакетов.
Более общее название такого подхода — АОП
для меня этот уровень уже магия.
Судя по тому что вы видимо прочли этот пост:) то магией это останется не на долго:)
> Наша аннотация будет считать время выполнения метода
Вы уж извините, но это звучит абсолютно безграмотно. Аннотация сама по себе ничего не может считать. Аннотации — лишь метаинформация, метаданные. Вы сами это прекрасно знаете, но читателей (новичков) вводит в заблуждение, как будто действительно какая-то магия происходит.
Конечно сама аннотация ничего не считает. Но некоторая магия всё же происходит :) Попробую как-нибудь по другому написать.
Плюсую в топик и в карму. Для меня использование аннотация для профайлинга не очень интересно, т.к. JProfiler-a хватает вполне, но вот сам пример нетривиального использования pluggable annotation processor'a, модифицирующего код — очень интересен. В который раз убеждаюсь, что в недрах com.sun.* лежат сокровища :)
Отличная статья, именно то, что искал для своего проекта
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории