2014-09-18 76 views
2

我正在经常使用MethodHandles.Lookup类的情况下工作。在这种情况下,在多个查找之间保留MethodHandles.lookup()的值是否明智? (具体来说,我正在使用的唯一查找方法是unreflect(java.lang.reflect.Method)。)缓存MethodHandles.lookup()的结果?

这会加快速度,还是会不相关?或者,它会因为某种原因真的放慢速度吗?

+0

考虑添加一个java-8标记,因为它可能正在受到核心Java团队更严密的监视。你也可以用'jmh'做一些实际的测量。 – 2014-09-18 21:04:47

+1

我怀疑你会发现他们已经被缓存在幕后。一般来说,你应该对应用程序缓存保持警惕。他们通常比他们的价值更麻烦,我从痛苦的经历中讲话。 – EJP 2014-09-19 00:10:56

+0

你不反映什么样的方法?如果他们是'public',则可以使用['publicLookup()'](http://docs.oracle.com/javase/7/docs/api/java/lang/invoke/MethodHandles.html#publicLookup())已经是一个单身人士。 – Holger 2014-09-19 08:09:56

回答

1

与往常一样,性能,唯一的好答案是测试,测量,测试一而再,再测量......

话虽这么说,是缓存可能会更快,问题是会是显著更快你的上下文。

缓存的缺点是内存使用和线程安全。 MethodHandle本身似乎是不可变的(没有明确记录,但看着合同,这很可能是这种情况)。 MethodHandles.Lookup用于检查安全约束,因此缓存可能允许您绕过或至少更改有关安全约束的行为。这可能会或可能不会成为您的担忧。

如果缓存大量不同的MethodHandle,则内存使用会发挥作用。您需要确保缓存的大小和大小正确。我的猜测是,你不会缓存很多不同的实例,但这只是一个猜测......