我正在开发一个应用程序,其中一种设计方法涉及到非常频繁地使用instanceof运算符.虽然我知道面向对象设计通常会尽量避免使用instanceof,但那是另一回事,这个问题纯粹与性能有关.我想知道这是否会影响性能?和==一样快吗?

例如,我有一个基类,它有10个子类.在接受基类的单个函数中,我判断类是否是子类的实例,并执行一些 routine .

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

JVM是否以某种方式对instanceof进行了优化,以使其速度更快?我想坚持使用Java,但应用程序的性能至关重要.如果以前走过这条路的人能提供一些建议,那就太酷了.我是不是太吹毛求疵了,还是把注意力放在了不该优化的事情上?

推荐答案

现代JVM/JIT编译器已经消除了大多数传统上"缓慢"操作的性能影响,包括instanceof、异常处理、反射等.

正如Donald Knuth所写,"我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源."instanceof的性能可能不会成为问题,所以在确定这是问题所在之前,不要浪费时间想出奇异的解决方法.

Java相关问答推荐

如何在PFA中使用不确定的进度指标制作可暂停的任务?

Java字符串常数池困惑

@从类文件中删除JsonProperty—Java

使用@MappdSuperClass扩展ParentClass&Won t继承ParentClass属性

Exe4j创建的应用程序无法再固定在任务栏Windows 11上

Hibernate EmptyInterceptor可以工作,但不能拦截器

更新GWT 2.5.1到2.11.0和sencha GXT 3.1.1到4.1时出现错误

Spring Data JPA慢慢地创建了太多非活动会话

我正在try 跟踪数组中最大的两个数字

对于亚洲/香港,使用ResolverStyle.STRICT的LocalDate.parse返回意外结果

测试何时使用Mockito强制转换对象会导致ClassCastException

在Java 17中使用两个十进制数字分析时间时出错,但在Java 8中成功

带错误BER验证的itext8签名返回pdf

Groovy/Java:匹配带引号的命令选项

Java创建带有扩展通配符的抽象处理器

如何在EL处理器中定义带有命名空间的变量?

JavaFX标签中的奇怪字符

保持标题窗格的箭头可见,即使设置为不可折叠

Java返回生成器的实现

Java 21保护模式的穷尽性