现在我正在编写一个ORM框架并非常关心性能。
在此框架中,我必须使用instanceof
和Class.isAssignableFrom
来检查类型兼容性。
所以我对instanceof
和Class.isAssignableFrom
它到底有多慢?
答案 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编译,然后转储和检查它来查明它是如何实现的。本地代码。
但是,我认为这不会特别有启发性。您真正想知道的是instanceof
或Class.isAssignableFrom
是否更快。您可以通过仔细的微基准测试来衡量这一点。
FWIW,我预测你会发现instanceof
更快。 (我希望JIT编译器能够以无法优化反射版本的方式优化instanceof
。)
但最后,我建议你不要在这个阶段浪费你的时间进行这种优化。使用instanceof
对此进行编码,并等到您有一些分析数据告诉您instanceof
用法确实是性能瓶颈。 (“关心绩效”这一切都很好......但实际上,在性能成为关键问题之前,你需要做出更重要的事情。)
答案 2 :(得分:1)
首先,如果你要进行微观测试,至少要运行一个大循环和平均值,因为你的时间会看到很多噪音。
说过,是的,反思很慢。如果你可以围绕它设计并使用其他任何东西,那就去做吧
例如,如果您将使用的类集很小并且事先已知,请将它们保存在Map<Class,[Something]>
中并在那里查找它们 - 您将需要所有子类都在该映射中,但查找将比一个实例快得多(这基本上是很多快速序列化库避免反射的原因)
如果你不想(不能)提前构建这个地图,你可以在运行时将它构建为缓存,然后每个新类只需要一次instanceOf调用