如何在JAVA内部实现instanceof?
现在我正在编写一个ORM框架,并非常关心性能。
在这个框架中,我必须使用instanceof
和Class.isAssignableFrom
来检查类型的Class.isAssignableFrom
。
所以我对instanceof
和Class.isAssignableFrom
的性能有点怀疑
它究竟有多慢?
如何在JAVA内部实现instanceof?
简单的答案是它依赖于平台。
长时间的答案是,你应该能够通过编写一个使用instanceof
的测试用例,在循环中运行它来确保它获得JIT编译,然后转储和检查本机代码,从而了解它是如何实现的。
但是,我认为这不会特别有启发性。 你真正想知道的是instanceof
或Class.isAssignableFrom
是否更快。 您可以通过仔细的微观基准来衡量。
FWIW,我预测你会发现instanceof
更快。 (我期望JIT编译器能够以无法优化反射版本的方式优化instanceof
。)
但最后,我建议你在这个阶段不要浪费你的时间和这个优化级别。 使用instanceof
编码,然后等待,直到有一些分析数据告诉您instanceof
使用情况确实是性能瓶颈。 (“关心表现”这一切都非常好......但实际上,在表现成为关键问题之前,您需要做出更重要的事情。)
instanceof应该更快,它是一个字节码操作
public static void main(String[] args) {
boolean res1 = args instanceof Object;
字节码
ALOAD 0
INSTANCEOF java/lang/Object
ISTORE 1
相比于
boolean res2 = Object.class.isAssignableFrom(args.getClass());
字节码
LDC Ljava/lang/Object;.class
ALOAD 0
INVOKEVIRTUAL java/lang/Object.getClass()Ljava/lang/Class;
INVOKEVIRTUAL java/lang/Class.isAssignableFrom(Ljava/lang/Class;)Z
ISTORE 2
首先,如果你打算以微观为基准,至少要运行一个大的循环和平均值,因为你看到了很多噪音。
话虽如此,是的,反思很慢。 如果你可以围绕它设计并使用其他任何东西,那就去做吧。
例如,如果您要使用的一组类很小且事先已知,请将它们保存在Map<Class,[Something]>
并在那里查找它们 - 您需要所有子类都在该地图中,但是查找会比实例快得多(这基本上是很多快速序列化库避免反射的原因)
如果您不希望(不能)预先构建此映射,则可以在运行时将其构建为缓存,然后每个新类只需要一次instanceOf调用
上一篇: How instanceof is implemented inside JAVA?
下一篇: Does instanceof operator generate a lot of overhead ? Why?