gpt4 book ai didi

Java - 接口(interface)/基类引用 - 性能

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:44 24 4
gpt4 key购买 nike

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

InterfaceIF ref = new SomeObject();

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

这个解释的很精彩here also.

但是我无法理解的一件事是:

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

最佳答案

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

  • 对于最终类,可以将方法调用优化为 native CALL 指令。这是微不足道的情况。

  • 如果类不是最终类但还没有加载子类,则在开始的某处进行一次额外检查是一样的。当检查失败时,JVM 必须丢弃这个过度优化编译的方法并重新编译(没什么大不了的)。

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

  • candidates越多的cases明显越慢(双态和megamorphic谷歌)。

显然,没有什么可以更快地通过接口(interface)进行调用。

如果有多个实现并且从一个调用站点调用了多个实现,那么就会产生虚拟调用分派(dispatch)的开销。有关详细信息,请参阅 this answer还有这个benchmark .

关于Java - 接口(interface)/基类引用 - 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903345/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com