首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抽象类比Java中的接口更快吗?

抽象类比Java中的接口更快吗?
EN

Stack Overflow用户
提问于 2018-06-30 08:00:06
回答 2查看 2.8K关注 0票数 5

根据本文的这里,在抽象类和接口上,抽象类略快于接口。为什么,你能用JVM来解释使用接口和抽象类的机制吗?

  1. Java中抽象类和接口之间的第四个区别是,抽象类略快于接口,因为接口在调用Java中的任何重写方法之前需要进行搜索。在大多数情况下,这并不是一个显著的差别,但是如果您正在编写一个时间关键的应用程序,那么您可能不想留下任何未完成的任务。
EN

回答 2

Stack Overflow用户

发布于 2018-07-02 08:37:25

答案取决于实现细节,但在这种形式下,它是不正确的。事实上,作者已经尝试通过使用“稍微”一词来回避事实-检查,以便让你永远不会观察到这样的性能差异。

正如在这个板中阐述的那样,这种语句背后的思想是,普通类有一个由子类继承的可重写方法表(也称为“vtable”),子类可以在最后添加新方法,并为它们覆盖的方法替换表条目。因此,第一个解析只需要找到可以记住的表索引,因此后续调用只需要在该索引处调用实际接收方类的方法。

由于接口可以由不具有继承关系的不同类实现,因此实现方法可能位于这些类的不同表索引处。解决这一问题的一种方法是从接口的表到实际的类表进行某种映射。假设这种双重调度导致了调用接口方法比普通方法慢的假设。

但是,像HotSpot JVM这样的JVM不使用这种双重调度。它们像任何其他虚拟方法调用一样,针对实际的接收方类解析接口方法调用。只要接收器是同一类层次结构的一部分,例如,您在Appendable接口上调用一个方法,并且接收方始终是Writer类的子类,则不需要额外的步骤。对于大多数的接口方法调用,这是相当好的工作。

在有些情况下,接口方法调用将在不相关类的不同实现中结束,例如,当对Appendable方法的调用有时在StringBuilder而其他时候在Writer结束时,但是,我们有一个无法比拟的场景。这种特定的调用可能比普通的方法调用稍微慢一些,但是由于不可能用抽象类构造相同的场景,所以说它比在这里使用抽象类慢是没有任何意义的。

对于性能相关的代码部分(也称为热点),JVM将执行运行时优化,这将使这种技术差异变得无关紧要。即使是普通虚拟方法调用的微小开销通常也会被消除,因为随后的优化严重依赖于积极内联目标方法的代码的能力,从而能够使用调用方的上下文及其已知的周围条件来优化被调用方的代码。

票数 12
EN

Stack Overflow用户

发布于 2022-04-28 07:28:53

  • 接口比抽象类慢,因为在解析对接口实例的函数调用时,需要在虚拟表中查找,以了解实现类的确切方法。这种查找需要时间,而解析抽象类方法执行并不需要时间。
  • 因此,抽象类方法调用执行要比接口方法执行速度快。
  • 现代JVM正在探索在使用接口时减少这种速度损失的方法。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51112973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档