为什么从Android的性能提示中删除了“避免只需要Ints的枚举”?

时间:2011-02-28 14:29:09

标签: android enums

从官方developer documentation中删除了“避免只需要Ints的枚举”部分。 (有关旧版内容,请参阅Why doesn't Android use more enums?

为什么呢? Android VM是否有改变使得提示过时了?

6 个答案:

答案 0 :(得分:157)

该文件的原始版本只是一堆偏见。它被重写为仅包含由实际基准备份的事实,并且随着VM的更新而更新。您可以在http://code.google.com/p/dalvik/找到各种基准 - 以及我们用于优化核心库的一些基准 -

答案 1 :(得分:26)

猜测:

  • Gigahertz像Hummingbird和Snapdragon这样的CPU现在很常见,而最初限制Dalvik VM的小代码小内存要求已不再如此。
  • 每个运输设备都使用JIT(2.2的新功能)。枚举的类初始化程序运行得更快,值可能被视为JIT时间常量,而JIT可能对精简枚举类有特殊的支持。
  • 真正性能敏感的代码使用NDK,当Android 1.5发布时,它仍然是新的和未经修改的。 2.3中的NDK支持本机活动,允许几乎完全不受管理的游戏。

因此,对于GUI应用程序的相对平凡的要求,枚举的开发时间好处远远超过额外的运行时成本。

答案 2 :(得分:23)

Elliott Hughes在他的博客上提供了有关文档重写的更多详细信息:http://elliotth.blogspot.com/2010/09/java-benchmarks.html

该帖子的后半部分解释说,性能文档的每个声明现在都备有基准。该文档的早期版本显然包含未经证实的声明,例如“避免枚举,因为它们太贵了。”

答案 3 :(得分:12)

Elliot Hugues的2011年答案说,避免枚举的最初原因是出于性能原因......就像“处理性能”一样。由于这个原因没有得到事实的支持,因此它已从官方文档中删除。

之后又添加了它,因为枚举在内存中添加的数据比使用整数要多得多。

答案 4 :(得分:7)

答案 5 :(得分:0)

TLDR: Dalvik的内存分配不佳,并且Enum使用的内存比int多。 Android Lollipop被ART取代了Dalvik,而ART不受同样的限制。因此,该建议不再适用。

详细答案:

哇! 8年,5个答案和许多评论以后,真正的原因仍然没有解决。

在棒棒糖问世之前的Android时代,Dalvik是使用的虚拟机进程。由于在此期间可供应用程序使用的内存量很少,因此Dalvik具有很多内存限制。为了进行内存分配,Dalvik必须走堆并寻找空间。随着时间的流逝,堆也将变得支离破碎。 Dalvik无法进行碎片整理,因此它将随着时间的流逝而分配,最终耗尽空间。

  

避免只需要整数的枚举

来自Dalvik时代,因为Enumint大得多,并且内存分配非常昂贵。

如今,Dalvik已被ART取代。 ART在奇巧(KitKat)中问世,自Lollipop以来便是默认设置。

ART是从头开始创建的,不是为了优化内存而是为了优化性能。它还针对分配和收集进行了优化。原因是它为大型对象预留了内存。与其将所有内容放在同一堆中, 然后必须在所有微小对象之间寻找空间,ART将所有大型对象和位图放在单独的堆中。然后,小对象进入单独的堆。也可以进行碎片整理。

在ART之后,如果您使用Enum,则Android无关紧要,这就是为什么现在不建议这样做的原因。

这来自Google的Chet Haase。我建议找到他的Google I / O谈话并观看整个视频。它包含许多有用的信息和对Android的深入了解。