Производительность вызова метода /Field.getAnnotation(Class) несколько раз против предварительного кэширования этих данных на карте

Я хотел бы знать, есть ли какие-либо сравнения/исследования о производительности повторного вызова (на Java) методов Method.getAnnotation(Class) и Field.getAnnotation(Class) по сравнению с сохранением (во время запуска программы) предварительно вычисленной Карты с этим информацию метаданных о классах и повторение этого запроса позже. Какой из них обеспечит наилучшую производительность во время выполнения?

И этот результат будет таким же в Java 5, 6 и 7?

Ответ 1

Карта должна быть более предпочтительным. Основная проблема заключается не только в кэшировании. Но также улучшите многопоточность. В Method.getAnnotation() он вызывает синхронный закрытый метод declAnnotations(). Синхронный метод плохо влияет на высокопоточное приложение.

Ответ 2

Я думаю, это немного зависит от реализации JVM. Но, опираясь на пример JVM Oracle, он хранит кеш всех аннотаций в методах и экземплярах полей, что эквивалентно используемому вами картографическому подходу.

Но здесь есть улов; поскольку экземпляры метода/поля уникальны для каждого объекта, в случае, если вы в конечном итоге создаете много объектов для данного класса, вы в значительной степени теряете выгоду от производительности. Именно в этом случае статическая карта имени класса + имя-метода/имя-класса-имени + в соответствующем списке аннотаций превосходит используемый встроенный подход кэширования.

Кстати, как вы предварительно вычисляете карту? Это делается при запуске приложения или в некотором автоматическом сгенерированном коде? Вы действительно подтвердили, что безопасно кэшировать экземпляры аннотаций в вашем случае?

Как всегда, для таких вопросов лучшим решением является профилирование/измерение с вашим приложением на линии и переход с решением, которое выглядит как победа в данном случае использования.