【问题标题】:What is the Performance impact of Sealed Classes in the context of Android?密封类在 Android 环境中的性能影响是什么?
【发布时间】:2019-05-04 10:04:03
【问题描述】:

在 Android 中,由于性能问题,建议不要使用枚举。直到最近才如此,在 Google IO 2018 中宣布枚举现在可以安全使用,但对于性能更高的应用程序仍然建议避免使用枚举。

我的问题是:

我们可以在 android 中广泛使用 kotlin 密封类吗?

看起来密封类是枚举的扩展。如果是这样,我们应该使用类似于枚举的密封类吗?

提前致谢。

【问题讨论】:

    标签: android performance kotlin enums sealed-class


    【解决方案1】:

    密封类的性能影响与任何其他类相同。如果您创建扩展密封类的类的实例,它将是一个新实例,因此需要对它进行垃圾收集。如果你有一个 object 扩展一个密封类,它将是一个单例并且不需要被收集(就像一个枚举常量)..

    【讨论】:

      【解决方案2】:

      在 Android 上远离enum 的建议被夸大了。避免枚举对 Android API 来说是有意义的:它们大量使用特殊常量,应用程序中存在大量此类对象,而且它们对性能至关重要。

      您的自定义应用程序代码可能只想使用几个枚举来表达业务逻辑中的实体。创建十几个甚至几百个enum 实例将留下难以察觉的足迹。

      同样的建议也适用于密封类:一定要使用它们并提高代码质量。仅当您计划着手构建具有成千上万个类似枚举的常量和类的 100 KLOC 应用程序时,才停止考虑您的选择。

      【讨论】:

        【解决方案3】:

        枚举

        垃圾收集

        在底层,枚举是类的静态成员,因此它们不会被垃圾回收。它们会在您的应用程序的整个生命周期中保留在内存中。这可能是有利的,也可能是不利的。

        垃圾收集过程在 CPU 使用方面的开销很大。对象创建也是如此,您不想一次又一次地创建相同的对象。因此,使用枚举,您可以节省垃圾收集和对象创建的成本。这是好处。

        缺点是枚举即使不使用也会留在内存中,这样可以一直占用内存。

        需要考虑的因素

        如果您的应用中有 100 到 200 个枚举,则无需担心所有这些。但是当你有更多的时候,你可以决定是否应该使用枚举,这取决于枚举的数量、它们是否会一直使用以及分配给你的 JVM 的内存量等事实。

        比较

        when 表达式中的枚举值比较更快,因为它在后台使用 tableswitch 来比较对象。

        安卓

        在 Android 中,启用优化后,Proguard 会将没有函数和属性的枚举转换为整数。这样,您就可以在编译时获得枚举的类型安全性以及在运行时获得 int 的性能!


        密封类

        垃圾收集

        密封类只是普通类,唯一的例外是它们需要在同一个包和同一个编译单元中进行扩展。因此,他们的表现与普通课程相当。

        密封类的子类型的对象像常规类的对象一样被垃圾收集。因此,您必须承担垃圾收集和创建对象的成本。

        需要考虑的因素

        当您的内存限制较低时,如果您需要数千个对象,您可以考虑使用密封类而不是枚举。因为垃圾收集器可以在内存不足且对象未使用时收集对象。

        如果您使用object 声明来扩展密封类,则对象充当单例并且它们不会被垃圾回收,这种行为类似于枚举。但是加载关联的类并将它们保存在内存中会产生额外的成本,因为object 声明具有与底层对象同名的关联类。

        比较

        when 表达式中密封类的类型比较较慢,因为在底层它使用instanceof 来比较类型。在这种情况下,枚举和密封类之间的速度差异很小。仅当您在循环中比较数千个常量时才有意义。

        安卓

        Proguard 没有任何整数优化,如密封类的枚举。因此,如果您想在 Android 中只使用没有函数和属性的常量,那么坚持使用枚举是一个更好的主意。


        就是这样!希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-11-12
          • 2010-09-22
          相关资源
          最近更新 更多