继承会影响应用程序的性能吗?

4
我想知道是否可以通过使用尽可能多的超类来改善应用程序的性能。我的问题是关于Kotlin的,但我认为Java的答案也将是相同的。
假设您有这样的继承架构(右侧的类是左侧类的子类):A < B < C < D < E < F < G < ...一直到Z。
假设您不需要所有子类中定义的所有内容,只需要A类的属性和函数。由于某种不明原因,您的代码仅使用Z类。
我的问题很简单:如果您将代码更改为仅使用A类而不是Z类,那么代码是否会更具性能?
感谢您提前回答。

1
如果你在考虑方法调用的成本,那么这些并不受类型层次结构深度的影响。首先具有继承存在的一些小的开销(与静态方法等相比),但即使是这些部分也可以被JIT编译器优化掉。 - OhleC
谢谢你的回答,但我正在寻找一个一般性的答案。我认为在我的代码中使用“JpaRepository”而不是“CrudRepository”永远不会对我的代码性能产生足够大的影响以至于看得出差异,但是我想知道这是否在一个有许多类和继承的庞大应用程序中会产生影响...我的问题纯粹是理论上的,我不认为答案会改变我的编码习惯,但我真的想知道... - Ctorres
1
我认为这不是一个实时场景。在实际情况中,我认为您不需要超过3到4个深度。即使这是您的情况,我认为这很难管理,并且在这种情况下很难维护。 - Akiner Alkan
@ Hulk 所以我们可以说,创建 A 的实例而不是 Z 将更有效,因为 A 类包含的属性和方法比 Z 类少。这就是我正在寻找的答案,即使它非常合乎逻辑,而且现在你说了它也很明显。如果你花时间撰写一个答案,我会接受它。谢谢。 - Ctorres
这个问题并不清楚它是在询问更改使用的对象类型还是访问它们所使用的引用类型。由于JpaRepositoryCrudRepository接口,我猜它一定是在问关于引用类型的问题。(如果是这样的话,答案是:不,我认为这并不重要,因为分派是在对象本身上进行的,而不是在引用类型上。) - gidds
显示剩余3条评论
2个回答

3

如果

"将您的代码更改为只使用A类而不是Z类"

包含构建,则有一个简单的答案:

创建并存储具有较少属性/字段的对象比创建具有更多属性的对象更便宜,无论是在内存方面还是在初始化所需的时间方面。

除此之外,我不会预期对性能产生显着影响。


话虽如此,在这里我不会担心性能 - 选择提供最佳抽象的类型来完成您想要执行的操作。如果您的代码不关心使用的特定子类,并且不需要子类提供的任何功能,请使用更通用的类型。这样您的代码保持更加灵活。但是,如果您的代码在某个时候需要这种功能,即您必须在后续阶段引入强制转换(casts),那么你已经走得太远了。


1
答案是肯定的。例如,如果您调用方法z.someMethod(),Hotspot将首先在Z类中查找该方法。如果HotSpot没有找到目标方法,则它会在Z的父类中查找该方法,并继续这些步骤,直到找到目标方法。因此,如果继承链很长,查找方法需要更多时间。
然而,HotSpot使用一些缓存来加速这个过程。 HotSpot虚拟调用

1
这个查找是在类加载时执行一次的。它太微不足道,不能被视为开销。 - jingx
你是正确的。在类加载和链接之后,HotSpot知道目标方法的虚函数表槽位。调用虚方法时,它只需索引一个数组,如vtable [slot]... - flycash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接