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

“避免只需要整数的枚举”部分已从官方 开发人员文档中删除。(旧章节内容见 为什么 Android 不使用更多的枚举?)

为什么? Android 虚拟机有什么变化让这个提示过时了吗?

28717 次浏览

猜猜看:

  • 像蜂鸟和 Snapdragon 这样的 Gigahertz CPU 现在很常见,最初限制 Dalvik VM 的小代码小内存需求也不再正确。
  • 每个运输设备都使用 JIT (2.2版本的新版本)。枚举的类初始化器将运行得更快,值可能被视为 JIT 时间常量,而 JIT 可能对简化枚举类有特殊的支持。
  • 真的性能敏感的代码使用 NDK,当 Android 1.5发布时,NDK 还是新的、未经修饰的。2.3中的 NDK 支持本地活动,允许几乎完全非托管的游戏。

因此,对于 GUI 应用程序相对普通的需求,枚举的开发时益处远远大于额外的运行时成本。

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

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

文章的后半部分解释了 Performance 文档上的每个声明现在都有基准的支持。以前版本的文档显然包含未经证实的声明,比如,“避免枚举,因为它们太昂贵了。”

Elliot Hugues 在2011年的回答中表示,避免枚举的最初原因是出于性能方面的考虑... ... 比如“处理性能”。由于这个理由没有事实依据,所以从官方文件中删除了。

它是后来添加的,因为枚举在内存中添加的数据比使用整数添加的数据多得多。

这仍然不利于内存性能。

Https://developer.android.com/training/articles/memory.html#overhead

编辑: 现在它被删除了。可以安全地使用枚举。

TLDR: Dalvik 在内存分配方面表现不佳,Enumint使用更多的内存。Android Lollipop 取代了达尔维克,使用抗逆转录病毒疗法,这种疗法不会受到同样的限制。因此,这个建议不再相关。

长话短说:

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

在前棒棒糖 Android 时代,Dalvik 是虚拟机使用的进程。由于在此期间只有少量内存可供应用程序使用,Dalvik 有很多内存限制。对于内存分配,Dalvik 必须遍历堆并找到空间。随着时间的推移,堆也会变得支离破碎。达尔维克无法碎片整理,所以它会随着时间的推移分配,最终耗尽空间。

避免只需要整数的枚举

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

快进到今天,达尔维克已经被 ART 所取代。 ART 是在 KitKat 出现的,自从棒棒糖以来就是默认的。

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

在 ART 之后,如果你使用 Enum,Android 并不关心,这就是为什么现在推荐消失了。

这是来自谷歌的 Chet Haase。我建议找到他的谷歌 I/O 谈话和观看整个视频。它包含了很多关于 Android 的有用信息和见解。