【发布时间】:2016-12-10 21:29:04
【问题描述】:
假设我有一个扩展 A 的对象 A 和 B。 B 具有与 A 无关的全局变量(一个数组和一些计数器)。
由于显式转换的成本很高(我不确定多少),从纯粹的性能观点来看,仅在需要时才创建一个 A 类并创建一个数组会更好,这样我就不必演员?
我想问题是,一个对象的全局变量是否需要花费任何东西,即使未使用?
编辑:显然忘记添加最重要的...功能了。
【问题讨论】:
标签: android performance inheritance
假设我有一个扩展 A 的对象 A 和 B。 B 具有与 A 无关的全局变量(一个数组和一些计数器)。
由于显式转换的成本很高(我不确定多少),从纯粹的性能观点来看,仅在需要时才创建一个 A 类并创建一个数组会更好,这样我就不必演员?
我想问题是,一个对象的全局变量是否需要花费任何东西,即使未使用?
编辑:显然忘记添加最重要的...功能了。
【问题讨论】:
标签: android performance inheritance
近年来,继承经常被视为代码异味,因为它会导致不同的问题: https://dzone.com/articles/is-inheritance-dead
如果我们用纯粹的性能术语来说,一个空数组在 RAM 中占用大约 8 个字节(4 个字节存储长度和 4 个字节一个引用,但它有点依赖于平台:How much space does an array occupy?)。因此,即使您有一千个这样的对象,一个数组字段也将占用大约 1_000 * 8 字节 ~ 8 KB 的 RAM。
您可能知道,如今的手机通常包含 > 1 GB 的 RAM。但是,不要忘记您的应用程序通常需要 60 到 192 MB 的 RAM (Detect application heap size in Android)。
在任何情况下,不计算你添加到类中的每一个小字段就足够了。
但是,回到我的第一句话,我建议您考虑使用组合而不是继承来解决问题,正如 Effective Java 中所建议的那样
更新
关于性能,我建议您阅读此主题:The performance impact of using instanceof in Java您确定需要这种类型的过早优化吗?还是理论问题多于实际问题?
【讨论】:
由于显式转换成本很高(我不确定多少),会不会 更好,从纯粹的性能 pov,只创建一个 A 类和 仅在需要时才创建一个数组,这样我就不必强制转换?
除了关于选角成本的可疑声明之外,也许我有误解,但这对我来说是个危险信号。如果您的设计涉及将对象转换为子类,则可能以其他方式更好地设计。我不能说什么没有看到更多,但需要铸造通常是设计失败的标志*。正如 Gaket 所暗示的,组合可能会更好,或者可能会有其他一些变化——工厂模式?
其次,只有当您注意到性能问题或有真正的理由认为会出现性能问题时,您才应该关注性能问题。处理器所做的几乎所有事情都会非常快,除非它完成了很多次(比如数百万次)。您的性能问题(除非您的程序在某些方面不寻常)很可能是 I/O 或内存。然后在确定性能瓶颈后,修复它的步骤是:
不要遗漏任何步骤。
*我知道强制转换是 Android 编程的核心部分,因为每次获取 View 时都必须强制转换,我想知道是否有更好的方法来做到这一点,但这就是我们坚持的问题
【讨论】: