2014-09-18 3 views
2

Я работаю в ситуации, когда часто используется класс MethodHandles.Lookup. В этой ситуации разумно ли сохранить значение MethodHandles.lookup() между несколькими поисками? (В частности, единственный метод поиска, который я использую, - unreflect(java.lang.reflect.Method).)Кэширование результата метода MethodHandles.lookup()?

Будет ли эта скорость что-нибудь, или это будет неактуально? Или, по какой-то причине, это фактически замедлит его?

+0

Рассмотрите возможность добавления тега java-8, потому что он, вероятно, более тщательно контролируется основной командой Java. Вы также можете выполнить некоторые фактические измерения с помощью 'jmh'. –

+1

Я подозреваю, вы обнаружите, что они уже кэшированы за кулисами. В общем, вы должны быть осторожны с кэшами на стороне приложения. У них обычно больше проблем, чем они стоят, и я говорю от горького опыта. – EJP

+0

Какие методы вы не видите? Если они являются «общедоступными», вы можете использовать ['publicLookup()'] (http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandles.html#publicLookup()), которые уже одноэлемент. – Holger

ответ

1

Как всегда с производительностью, только хороший ответ тест, измерение, тест снова, снова измерить ...

Это, как говорится, да кэширование, вероятно, будет быстрее, вопрос в том, будет ли она значительно быстрее ваш контекст.

Недостатком кеширования является использование памяти и безопасность потоков. МетодHandle сам по себе является неизменным (не явным образом документированным, но смотря на контракт, это, скорее всего, так). МетодHandles.Lookup используется для проверки ограничений безопасности, поэтому кэширование может позволить вам обойти или хотя бы изменить поведение в отношении ограничений безопасности. Это может быть или не быть проблемой для вас.

Использование памяти вступает в игру, если вы уберете много разных MethodHandle. Вы должны убедиться, что ваш кеш ограничен и правильно. Я предполагаю, что вы не будете кэшировать много разных экземпляров, но это только предположение ...