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

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

А эта производительность была бы одинаковой под Java 5, 6 и 7?

Ответы [ 2 ]

11 голосов
/ 17 января 2012

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

1 голос
/ 11 ноября 2011

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

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

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

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

...