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

时间:2013-11-11 09:52:51

标签: java performance

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

InterfaceIF ref = new SomeObject();

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

这是奇妙的解释here also.

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

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

1 个答案:

答案 0 :(得分:8)

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

  • 对于最终类,可以将方法调用优化为本机CALL指令。这是一件小事。

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

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

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

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

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