在Java中使用instanceof的性能影响

我正在开发一个应用程序,一种设计方法涉及对instanceof操作符的极大使用。 虽然我知道面向对象设计通常试图避免使用instanceof ,但这是一个不同的故事,而这个问题纯粹与性能有关。 我想知道是否有任何性能影响? 是和==一样快吗?

例如,我有一个有10个子类的基类。 在接受基类的单个函数中,我会检查类是否是子类的实例并执行一些例程。

我想解决这个问题的其他方法之一就是使用“type id”整数基元,并使用位掩码来表示子类的类别,然后仅对子类“type id”进行位掩码比较表示类别的常量掩码。

JVM优化的instanceof会比这个更快吗? 我想坚持使用Java,但应用程序的性能至关重要。 如果有人曾经走过这条路,可以提供一些建议,这将是很酷的。 我是挑剔太多还是专注于错误的事情来优化?


现代JVM / JIC编译器已经消除了大多数传统“慢速”操作的性能打击,包括instanceof,异常处理,反射等。

正如Donald Knuth所写,“我们应该忘记小效率,大约97%的时间:过早优化是万恶之源。” instanceof的性能可能不会成为问题,因此,不要浪费时间寻找异常的解决方法,除非您确定问题所在。


途径

我编写了一个基准程序来评估不同的实现:

  • instanceof实现(作为参考)
  • 通过抽象类定向对象并@Override测试方法
  • 使用自己的类型实现
  • getClass() == _.class实现
  • 我使用jmh运行100次热身呼叫,1000次重复测量和10次分析。 所以每个选项的测量次数为10 000次,这要花12点18分57秒才能在我的MacBook Pro上运行macOS 10.12.4和Java 1.8。 基准测量每个选项的平均时间。 有关更多详细信息,请参阅我在GitHub上的实现。

    为了完整起见:此答案的前一版本和我的基准。

    结果

    | Operation  | Runtime in nanoseconds per operation | Relative to instanceof |
    |------------|--------------------------------------|------------------------|
    | INSTANCEOF | 39,598 ± 0,022 ns/op                 | 100,00 %               |
    | GETCLASS   | 39,687 ± 0,021 ns/op                 | 100,22 %               |
    | TYPE       | 46,295 ± 0,026 ns/op                 | 116,91 %               |
    | OO         | 48,078 ± 0,026 ns/op                 | 121,42 %               |
    

    TL;博士

    在Java 1.8中, instanceof是最快的方法,尽管getClass()非常接近。


    我只做了一个简单的测试,看看instanceOf的性能如何与只有一个字母的字符串对象进行简单的s.equals()调用比较。

    在10.000.000循环中,instanceOf给了我63-96ms,字符串等于给了我106-230ms

    我用java jvm 6。

    所以在我的简单测试中,执行instanceOf代替单字符串比较会更快。

    使用Integer的.equals()而不是字符串给了我相同的结果,只有当我使用==时,我的速度比instanceOf快20ms(在10.000.000循环中)

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

    上一篇: The performance impact of using instanceof in Java

    下一篇: How instanceof is implemented inside JAVA?