我正在开发一个应用程序,其中一种设计方法涉及大量使用instanceof操作符。虽然我知道OO设计通常试图避免使用instanceof,但这是另一回事,这个问题纯粹与性能有关。我想知道是否有任何性能影响?Is的速度与==一样快
例如,我有一个包含10个子类的基类。在接受基类的单个函数中,我检查该类是否是子类的实例,并执行一些例程
我想解决这个问题的另一种方法是使用“type id”整数原语,使用位掩码来表示子类的类别,然后将子类“type id”与表示类别的常量掩码进行位掩码比较
JVM是否以某种方式优化了instanceof,使其速度更快?我想坚持使用Java,但应用程序的性能至关重要。如果有人曾经走过这条路,可以提供一些建议,那就太酷了。我是不是太挑剔了,还是把注意力放在了错误的事情上而没有进行优化
接近
我写了评估不同实施的基准计划:
instanceof实现(作为参考)- 通过抽象类和
@重写测试方法面向对象 - 使用自己的类型实现
getClass()====\u0.class实现
我使用了jmh以100次预热调用、1000次测量迭代和10次分叉运行基准测试。因此,每个选项都被测量了10000次,在macOS 10.12.4和Java 1.8的MacBook Pro上运行整个基准测试需要12:18:57。基准衡量每个选项的平均时间。有关更多详细信息,请参见我在GitHub上的实现
为了完整性:有一个此答案和我的基准的上一版本
结果
|操作|每个操作的运行时间(纳秒)|相对于instanceof| |------------|--------------------------------------|------------------------| |瞬时值| 39598±0022 ns/op | 100,00%| |GETCLASS | 39687±0021 ns/op | 100,22%| |类型| 46295±0026 ns/op | 116,91%| |OO | 48078±0026纳秒/op | 121,42%|
tl;博士
在Java 1.8中,instanceof是最快的方法,尽管getClass()非常接近