在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