如何在JAVA中实现instanceof?

时间:2013-01-07 05:07:05

标签: java performance instanceof

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

在此框架中,我必须使用instanceofClass.isAssignableFrom来检查类型兼容性。

所以我对instanceofClass.isAssignableFrom

的效果有点怀疑

它到底有多慢?

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:3)

  

如何在JAVA中实现instanceof?

简短的回答是它与平台有关。

答案很长,你应该能够通过编写一个使用instanceof的测试用例,在循环中运行它以确保它被JIT编译,然后转储和检查它来查明它是如何实现的。本地代码。

但是,我认为这不会特别有启发性。您真正想知道的是instanceofClass.isAssignableFrom是否更快。您可以通过仔细的微基准测试来衡量这一点。

FWIW,我预测你会发现instanceof更快。 (我希望JIT编译器能够以无法优化反射版本的方式优化instanceof。)

但最后,我建议你不要在这个阶段浪费你的时间进行这种优化。使用instanceof对此进行编码,并等到您有一些分析数据告诉您instanceof用法确实是性能瓶颈。 (“关心绩效”这一切都很好......但实际上,在性能成为关键问题之前,你需要做出更重要的事情。)

答案 2 :(得分:1)

首先,如果你要进行微观测试,至少要运行一个大循环和平均值,因为你的时间会看到很多噪音。
说过,是的,反思很慢。如果你可以围绕它设计并使用其他任何东西,那就去做吧 例如,如果您将使用的类集很小并且事先已知,请将它们保存在Map<Class,[Something]>中并在那里查找它们 - 您将需要所有子类都在该映射中,但查找将比一个实例快得多(这基本上是很多快速序列化库避免反射的原因)
如果你不想(不能)提前构建这个地图,你可以在运行时将它构建为缓存,然后每个新类只需要一次instanceOf调用