多次调用 Method/Field.getAnnotation(Class) 的性能与在 Map 中预缓存此数据相比

2022-09-03 15:00:33

我想知道是否有任何关于重复调用(在Java中)和方法的性能的比较/研究,而不是存储(在程序启动时)一个预先计算的Map和类的元数据信息,并在以后重复查询它。哪一个可以提供最佳的运行时性能?Method.getAnnotation(Class)Field.getAnnotation(Class)

这种性能在Java 5,6和7下是相同的吗?


答案 1

地图应该是一种更可取的方法。主要问题不仅仅是缓存。同时也改善了多线程争用。在 Method.getAnnotation() 中,它调用一个声明了 Noteations() 的同步私有方法。同步方法对高线程应用程序有不良影响。


答案 2

我想这有点取决于JVM的实现。但是以Oracle JVM为例,它维护了方法和字段实例上所有注释的缓存,这相当于您所说的映射方法。

但是,这里有一个问题。由于方法/字段实例对于每个对象都是唯一的,因此如果您最终为给定的类创建大量对象,那么您几乎会失去提供的性能优势。在这种情况下,类名 + 方法名 / 类名 + 字段名到相关注释列表的静态映射胜过所使用的内置缓存方法。

顺便说一句,您如何预先计算地图?它是在应用程序启动时完成的还是一些自动生成的代码?您是否真正确认在您的案例中缓存注释实例是安全的?

与往常一样,对于此类问题,最佳解决方案是使用您的应用程序进行分析/测量,并使用在给定用例中看起来获胜的解决方案。


推荐