Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么是;避免只需要整数的枚举";从Android上删除';什么是性能提示?_Android_Enums - Fatal编程技术网

为什么是;避免只需要整数的枚举";从Android上删除';什么是性能提示?

为什么是;避免只需要整数的枚举";从Android上删除';什么是性能提示?,android,enums,Android,Enums,“避免只需要整数的枚举”一节已从官方文档中删除。(有关旧部分内容,请参见) 为什么??Android虚拟机是否发生了变化,导致该提示过时?猜测: 蜂鸟(Hummingbird)和Snapdragon等千兆赫兹CPU现在很普遍,最初限制Dalvik虚拟机的小代码小内存需求也不再如此 每个装运设备都使用JIT(2.2新增)。枚举的类初始值设定项将运行得更快,这些值可能会被视为JIT时间常数,JIT可能会对优化枚举类提供特殊支持 真正对性能敏感的代码使用NDK,NDK在Android 1.5发布时仍

“避免只需要整数的枚举”一节已从官方文档中删除。(有关旧部分内容,请参见)

为什么??Android虚拟机是否发生了变化,导致该提示过时?

猜测:

  • 蜂鸟(Hummingbird)和Snapdragon等千兆赫兹CPU现在很普遍,最初限制Dalvik虚拟机的小代码小内存需求也不再如此
  • 每个装运设备都使用JIT(2.2新增)。枚举的类初始值设定项将运行得更快,这些值可能会被视为JIT时间常数,JIT可能会对优化枚举类提供特殊支持
  • 真正对性能敏感的代码使用NDK,NDK在Android 1.5发布时仍然是新的、未经完善的。2.3中的NDK支持本机活动,允许几乎完全非托管的游戏

因此,对于相对普通的GUI应用程序需求,Enum的开发时间优势远远超过了额外的运行时成本。

该文档的原始版本只是一堆偏见。它被重写为只包含由实际基准支持的事实,并且随着VM的更新而更新。您可以在以下网址找到各种基准测试,以及我们用于优化核心库的一些基准测试。

Elliott Hughes在其博客上提供了有关重写文档的更多详细信息:


这篇文章的后半部分解释说,性能文档上的每一个声明现在都用基准进行了备份。先前版本的doc显然包含未经验证的声明,如“避免枚举,因为它们太贵了。”

2011年Elliot Hugues的回答说,避免枚举的最初原因是出于性能原因。。。如“处理性能”。由于这一理由没有事实依据,因此从正式文件中删除


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

这对内存性能仍然不好

编辑:
现在它被移除了。使用枚举是安全的。

TLDR:Dalvik在内存分配方面做得不好,
Enum
使用的内存比
int
多。Android棒棒糖用艺术取代了Dalvik,而艺术并没有受到同样的限制。因此,这项建议不再相关

长答案:

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

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

避免只需要整数的枚举

来自Dalvik days,因为
Enum
int
大得多,而且内存分配非常昂贵

快进到今天,达尔维克已经被艺术所取代。艺术起源于KitKat,是自棒棒糖以来的默认产品

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

在ART之后,如果您使用
Enum
Android并不在意,这就是为什么推荐现在不见了


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

作为参考,这里是灌木林示例的字节码:截至2014年3月,以下页面仍然包含反对使用枚举的建议:一年后,正如@TahirAkhtar所说,官方Android培训仍然说“你应该严格避免在Android上使用枚举。”有趣的是,一位Android首席开发人员在2015年的这篇文章中提出了避免枚举的建议:另外:“请注意,使用Android Studio和Gradle 1.3+支持的@IntDef注释将使代码构建时类型安全(当启用lint错误时),同时保留使用int变量的大小和性能优势。”截至2018年4月,下页不再包含反对使用enum的建议。如果您在SO配置文件中列出您的凭据,这将有所帮助。我花了一些时间四处挖掘。但现在我看到你似乎在虚拟机团队工作,我将接受你的答案作为正式答案。:)添加枚举类当然意味着您的应用程序包含一个额外的类,因此它不是免费的,但我们必须假设开发人员只在有用的地方添加枚举。我所看到的唯一一个非常糟糕的枚举用法是在一些和谐代码中,它们确实需要int(用于位掩码等),而“enum”在任何合理的意义上都不是枚举。如果您发现自己经常调用“ordinal()”,这可能是一种难闻的气味,意味着您不需要枚举。但这并不是Android特有的技巧,而且这是一个非常罕见的设计错误。蒂埃里·迪米特里罗伊也过时了吗?具体地说,默认情况下,您应该严格避免在Android.FWIW上使用enum。您提供的链接已失效。只是想用此链接补充Elliott接受的答案。此外,Google还引入了
IntDef
注释,允许在Android Studio错误和警告中安全使用int常量。警告被撤回。作为参考,他们在这里正式表示: