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

Posted

技术标签:

【中文标题】继承会影响应用程序的性能吗?【英文标题】:Does inheritance can affect performances of an application? 【发布时间】:2019-06-19 03:07:02 【问题描述】:

我想知道是否可以通过使用更多的超类来提高应用程序的性能。我的问题是关于 Kotlin,但我认为 Java 的答案是一样的。


假设你有这个继承模式(右边的类是他左边的类的子类):A

说你不需要所有子类中定义的所有东西,只需要A类的属性和功能。出于一个模糊的原因,您的代码仅使用 Z 类。

我的问题很简单:如果你把你的代码改成只使用A类而不是Z类,代码的性能会更好吗?

提前感谢您的回答。

【问题讨论】:

如果您正在考虑方法调用的成本,这些成本不受类型层次结构深度的影响。首先继承的开销很小(与静态方法相比),但即使这样也可以忽略。 @Hulk 我问这两个问题。我的问题来自于我目前正在使用接口“JpaRepository”,它是 Spring Data JPA 中“CrudRepository”的子类,而现在,我不需要“JpaRepository”中定义的东西,那么我想知道是否我应该切换到“CrudRepository”。这个问题的更多细节:***.com/questions/14014086/… 感谢您的回答,但我正在寻找一个一般性的答案,我认为使用“JpaRepository”而不是“CrudRepository”永远不会影响我的代码的性能足以看到差异,但是我想知道在具有许多类和大量继承的大型应用程序中是否会出现这种情况......我的问题纯粹是理论上的,我认为答案不会改变我的编码习惯,但我真的很想知道... 我不认为这是一个实时场景。在实际情况下,我认为您不需要更多的 3-4 深度。即使这是您的情况,我认为这并不容易管理,并且在这种情况下很难维护。 @Hulk 所以我们可以说创建 A 而不是 Z 的实例会更有效,因为 A 类包含的属性和方法比 Z 少。这就是我一直在寻找的答案,即使它是完美的合乎逻辑,现在你说的很明显。如果您花时间编辑答案,我会接受。谢谢。 【参考方案1】:

如果

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

包括构造,那么有一个简单的答案:

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

除此之外,我预计不会对性能产生重大影响。


也就是说,我不担心这里的性能 - 选择为您想要做的事情提供最佳抽象的类型。如果您的代码不关心您使用的特定子类并且不需要子类提供的任何功能,请使用更通用的类型。这样你的代码就更灵活了。但是,如果您的代码在某些时候需要这样的功能,即您必须进一步引入强制转换,那么您就走得太远了。

【讨论】:

@Eduardo 我拒绝了您的编辑,因为虽然我同意使用组合而不是深层继承层次结构更好,但我认为这个建议会偏离问题的主题太多(即关于性能影响)。【参考方案2】:

答案是肯定的。 例如,如果您调用方法 z.someMethod()。 Hotspot 将首先在 Z 类中查找方法。如果 HotSpot 没有找到目标方法,它将在 Z 的父级中查找该方法。并继续这些步骤,直到找到目标方法。所以如果继承链长,查找方法会花费更多时间。

不过,HotSpot 使用一些缓存来加速这个过程。

HotSpot VirtualCalls

【讨论】:

这个查找在类被加载时完成一次。这太微不足道了,不能被视为开销。 你是对的。在类加载和链接之后,HotSpot 知道目标方法的 vtable 槽。调用虚方法,它只是索引一个数组,比如 vtable[slot]...

以上是关于继承会影响应用程序的性能吗?的主要内容,如果未能解决你的问题,请参考以下文章

打开浏览器开发者工具会影响应用程序性能吗?

变量会影响性能吗?

不同形式的预编译会影响性能吗?

使用 KMS 进行 AWS RDS 加密会影响性能吗?

取消隐藏和加载 webview 的顺序会影响性能吗?

写Java程序时偷懒简单写java.awt.*;之类导入很多模块会影响性能吗?