繁体   English   中英

Java - 接口/基类引用 - 性能

[英]Java - interface/base class reference - performance

这是在声明像这样的对象时使用接口/基类引用的一般编码实践:

InterfaceIF ref = new SomeObject();

我知道这提供了松散耦合,我们可以使用新的实现来更改/编写新类,而不会影响很多代码。

这里也有很好的解释

但有一点我无法理解,而且没有回答的问题是:

  • 使用接口/基类引用是否会影响性能。
  • 如果,是的,那么这会影响正面还是负面。

直接使用该类可能更快,从不慢。 如果JVM看到一个具体的类,它就会知道“谁来调用”。 不一定完全可能有子类,除非该类是最终的。 可能有一些JVM尚未看到的子类,后来加载。

  • 对于最终类,可以将方法调用优化为本机CALL指令。 这是一个微不足道的案例。

  • 如果类不是最终的,但是还没有加载子类,那么在开头的某个地方只需要一个额外的检查。 当检查失败时,JVM必须抛弃这种过度乐观的编译方法并重新编译(没什么大不了的)。

  • 当有子类时,一切都取决于在给定的调用站点上实际遇到多少子类。 如果只有一个,那么快速检查就足以验证给定的类是否是预期的类(通过将此测试移出循环等,这个开销变得可以忽略不计)。

  • 有更多候选人的案件显然较慢(Google为双形和巨型)。

显然,没有什么可以通过接口更快地进行呼叫。

如果有多个实现,并且从呼叫站点调用了多个实现,则会产生虚拟呼叫调度的开销。 有关详细信息,请参阅此答案和此基准

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM