在Java中使用instanceof对性能的影响

我正在开发一个应用程序,其中一种设计方法涉及大量使用instanceof操作符。虽然我知道OO设计通常试图避免使用instanceof,但这是另一回事,这个问题纯粹与性能有关。我想知道是否有任何性能影响?Is的速度与==一样快

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

我想解决这个问题的另一种方法是使用“type id”整数原语,使用位掩码来表示子类的类别,然后将子类“type id”与表示类别的常量掩码进行位掩码比较

JVM是否以某种方式优化了instanceof,使其速度更快?我想坚持使用Java,但应用程序的性能至关重要。如果有人曾经走过这条路,可以提供一些建议,那就太酷了。我是不是太挑剔了,还是把注意力放在了错误的事情上而没有进行优化

接近

我写了评估不同实施的基准计划

  1. instanceof实现(作为参考)
  2. 通过抽象类和@重写测试方法面向对象
  3. 使用自己的类型实现
  4. 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()非常接近

发表评论