如何在JAVA内部实现instanceof?

现在我正在编写一个ORM框架,并非常关心性能。

在这个框架中,我必须使用instanceofClass.isAssignableFrom来检查类型的Class.isAssignableFrom

所以我对instanceofClass.isAssignableFrom的性能有点怀疑

它究竟有多慢?


如何在JAVA内部实现instanceof?

简单的答案是它依赖于平台。

长时间的答案是,你应该能够通过编写一个使用instanceof的测试用例,在循环中运行它来确保它获得JIT编译,然后转储和检查本机代码,从而了解它是如何实现的。

但是,我认为这不会特别有启发性。 你真正想知道的是instanceofClass.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调用

链接地址: http://www.djcxy.com/p/76375.html

上一篇: How instanceof is implemented inside JAVA?

下一篇: Does instanceof operator generate a lot of overhead ? Why?