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

Thi*_*Roy 171 enums android

从官方开发者文档中删除了"避免只需要Ints的枚举"部分.(请参阅为什么Android不使用更多枚举?对于旧版内容)

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

Ell*_*hes 157

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

  • 如果您在SO配置文件中列出了凭据,这将有所帮助.我花了一些时间来挖掘它.但是现在我发现你似乎在VM团队工作,我会接受你的答案作为正式答案.:) (35认同)
  • 添加枚举类当然意味着你的应用程序包含一个额外的类,所以它不是_free_,但我们必须假设开发人员只在它们有用的地方添加枚举.我在enum中看到的唯一非常糟糕的用法是在一些和谐的代码中,他们真的想要整数(对于位掩码等)而且"枚举"不是任何合理意义上的枚举.如果你发现自己经常调用"序数()",这可能是一种难闻的气味,这意味着你不需要枚举.但这不是特定于Android的提示,无论如何它都是一个非常罕见的设计错误. (25认同)
  • @ [Thierry-DimitriRoy]的[本文档](https://developer.android.com/training/articles/memory.html#Overhead)是否过时了?具体来说,_你应该严格避免在Android上使用枚举._ (17认同)
  • 你给的链接已经死了. (10认同)
  • FWIW,[Proguard将enum转换为整数](http://stackoverflow.com/questions/32236870/does-proguard-converts-all-enums-to-int-or-needs-to-be-configured-for-this ) 默认情况下. (3认同)
  • @Elliott Hughes - 这意味着关于Enums的论文无法证明,或者它是假的? (2认同)

Jos*_*Lee 26

一个猜测:

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

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


jko*_*ker 23

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

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


Thi*_*Roy 12

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

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

  • 此外,谷歌人员引入了`IntDef`注释,允许安全地使用int常量和Android Studio错误和警告.http://blog.shamanland.com/2016/02/int-string-enum.html (2认同)

Ade*_*mad 12

TLDR: Dalvik 不擅长内存分配,Enum使用的内存比int. Android Lollipop 用 ART 取代了 Dalvik,它没有同样的限制。因此,该建议不再相关。

长答案:

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

在棒棒糖之前的 Android 时代,Dalvik 是 VM 使用的进程。由于在那段时间里只有少量内存可供应用程序使用,因此 Dalvik 有很多内存限制。对于内存分配,Dalvik 必须遍历堆并找到空间。随着时间的推移,堆也会变得碎片化。Dalvik 无法进行碎片整理,因此它会随着时间的推移分配并最终耗尽空间。

避免只需要整数的枚举

来自 Dalvik 时代,因为 anEnum比 an 大得多,int而且内存分配非常昂贵。

快进到今天,Dalvik 已被 ART 取代。ART 出现在 KitKat 中,并且自 Lollipop 以来是默认设置。

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

在 ART 之后,如果您使用EnumAndroid 则不在乎,这就是建议现在消失的原因。

这是来自 Google 的 Chet Haase。我建议找到他的 Google I/O 演讲并观看整个视频。它包含许多有用的信息和对 Android 的洞察。

  • 作为参考,这是他们官方所说的:https://youtu.be/IrMw7MEgADk?t=851 (2认同)

tog*_*kan 7

它对内存性能仍然不利.

https://developer.android.com/training/articles/memory.html#Overhead

  • 它再次消失了. (4认同)