Android性能:字符串 vs 枚举 vs 静态final整数

6

这方面之前在SO上已经有人问过,但我还没有找到太多关于实质性证据和/或决定性答案。

在Android中传递Bundle信息时,使用字符串枚举静态final int能否观察到任何性能增加/减少?

举个例子,我的应用程序中有几个场景需要加载并显示特定的fragment。每次加载fragment时,都会向其传递一个Bundle,其中包含两个参数:正在显示的数据的ID和指定如何显示它的模式。我已经设置了一个自定义状态页适配器来完成所有繁重的工作,但问题的关键在于:哪种方法(如果有的话)会提供任何性能增益/损失:

Bundle args = new Bundle();
args.putInt("ID", 1);

// method 1
args.putString("MODE", "Mode1");

// method 2
args.putSerializable("MODE", ModeEnum.Mode1);

// method 3
public static final int MODE_1 = 1; // this would be elsewhere in a constants class
args.putInt("MODE", MODE_1);

在这个代码片段中,模式被检查了多次,因此我比较关心哪种选项更适合存储在bundle中,哪种选项更适合在最终进行比较时使用。

如有任何建议、观察或经验,将不胜感激!


我倾向于使用枚举的序数,因为我不喜欢强制转换。 - njzk2
我认为你不会注意到使用任何一种方法的性能差异,我个人更喜欢在最终整数上切换。让我们等待一些专家向你展示一些汇编代码,解释最快的方法,然后告诉你实际上没有什么区别^^ - Droidman
@Droidman - 你很可能是对的;到目前为止,我找到的信息告诉我任何差异都将是微不足道的。现在至少80%是出于好奇心,而不是实际的优化工作。 - Mark Ormesher
1
@MarkOrmesher 性能方面几乎没有什么区别,内存方面 int 是胜者。 - Rod_Algonquin
1个回答

5
好的,所以我在网上进行了一些研究,并找到了信息,这些信息要么含混不清,要么不可靠,要么自相矛盾 - 简而言之,我没有找到答案。因此,我设置了一个小应用来测试这个问题。
该应用将200个条目从一个活动传递到另一个活动,然后使用这些值进行比较和查找数组和映射。然后它重复了这个过程9999次。
通过10k次这个过程的革命,每种方法都运行了多次,我得出了一个结论:
引用: 它并不重要你选择哪一个。
性能差异微小,我是指微小。字符串在大多数情况下以微弱的优势输掉了比赛,但整数和枚举类型都是最有竞争力的,有时字符串也会打败它们。
内存消耗的差异同样很小。只要您的字符串值不是段落文本,差异实在微乎其微。我们正在谈论几个百分点的增长。
总结: 当然,如果您的应用程序一直传递着成千上万的Bundle值*,那么使用整数或枚举(以代码库为基础的自然方式)来优化它可能是值得的。但否则,任何增加你得到的效果都不值得花费来创造它。
*如果您这样做,您可能已经知道了这一点,或者您的应用程序基础设施存在问题!

2
枚举和整数相比字符串的一个重要优势是IDE可以捕获拼写错误并拒绝为您编译。当您试图弄清楚为什么无法在case语句中匹配String时,这非常有用。 - Ehtesh Choudhury

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接