哪个更快:instanceof 还是 isInstance?

4
现代JVM上哪种更快?除了设计问题,这个问题的答案是什么?
foo instanceof Bar

或者

Bar.class.isInstance(foo)

为什么?

2
#1. 这已经是语言内置的功能了,你不可能得到比这更好的了。 - Louis Wasserman
8
几乎从不重要哪个更快。 - biziclop
@LouisWasserman 我并不是在试图做得更好,我只是好奇哪个操作更快。 - artspb
1
如果不进行测量,就几乎无法确定。Class.isInstanceOf()是OpenJDK中的内在方法(可能也是每个现代VM中的内在方法),这意味着它尽可能快。另一方面,instanceof有自己的字节码操作,因此它可能甚至更快。Hotspot如何优化对每个调用的处理是另一回事。 - biziclop
3
Class.isInstance 是JVM内部函数,在编译时会被转换成与 instanceof 完全相同的指令序列(从HotSpot源代码的证明可以看出:1, 2)。也就是说,它们在性能上完全相同。 - apangin
显示剩余2条评论
2个回答

17

Class.isInstance 是JVM内置的函数。它被编译为与 instanceof 相同的序列(来自HotSpot源代码的证明:1, 2)。也就是说,它们在性能方面都是相等的。


1

foo instanceof Bar 应该更快。

如果在编译时不清楚你拥有哪个类,可以使用 Bar.class.isInstance(foo)

考虑以下内容:

void test(Object o1, Object o2) {
   o1.getClass().isInstance(o2);
}

在这个例子中,JVM会在运行时决定哪个类调用该方法。使用instanceof是不可能的。
因此,如果您在编译时知道类,应该使用instanceof

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接