硬编码字符串会影响性能吗?

18

每当我制作任何应用程序时,我总是硬编码字符串,而不是从XML中引用字符串资源。 应用程序可以正常工作,但会警告我使用@string资源。

例如按钮:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="click here" />

我的问题是,如果我这样做,是否会影响我的应用程序性能,或者(@string resource)仅用于国际化?


24
如果你硬编码开发者,他们的表现会变得更糟糕。;) - AlbeyAmakiir
7个回答

44

这是一条Android lint警告,旨在帮助您进行本地化。

从技术上讲,硬编码字符串可以使您的应用程序表现更好,因为它不必每次从相应的R int查找字符串。但是,这种性能差异将是微不足道的,没有人能注意到它。

然而,您应该始终将String资源保存在values文件夹中,因为这样可以非常容易地进行本地化。


1
@Raghunandan 是的。可能在10-100毫秒的范围内。 - Raghav Sood
3
关于“每次查找字符串...”这个问题,感兴趣的话,它不会在每次应用程序运行时再次查找字符串,而是缓存结果。这样做是否被视为过早优化呢? - deworde
1
@deworde 嗯。你可能是对的。我不是非常确定,但我会检查并回复你。 - Raghav Sood
10
我查看了源代码,至少在Java端没有涉及缓存。所有的getString()和getText()调用最终都会到达AssetManager.getResourceText(),然后将执行传递给本地代码。在此之前,至少没有任何缓存或临时存储。 - Raghav Sood

4

我认为使用硬编码字符串不会使性能变差,因为硬编码字符串涉及的步骤较少。然而,最佳实践是将资源字符串与应用程序和用户界面代码分离。


4
它不会造成任何性能问题。但是,为了方便维护和本地化,建议在strings.xml中定义字符串。例如,请考虑以下两种情况。
场景1:当你需要更改多处使用的字符串时。在你的情况下,你将不得不更改所有布局中的“点击此处”。但如果在strings.xml中声明,则只需更改xml中的一个即可更改它们全部。
场景2:另一个例子是,如果您想针对不同的区域设置显示不同的语言,则需要使用string.xml。

4

就像其他人所说的,这是用于本地化的, 但对于性能来说,它取决于每秒钟查找字符串的次数。 我曾经看过这样一个情况,在启动时应用程序很慢,堆栈采样显示50%的时间被耗费在查找字符串资源上,而查找字符串的原因是为了在启动应用程序时在闪屏上显示它们,给用户一些东西来看!


1
我认为在程序中硬编码字符串不会使其运行更慢。实际上,这将提高性能,因为不需要在 R.java 类中查找字符串。从 strings.xml 引用字符串是最佳实践,原因有两个: 1- 本地化 2- 如果您在多个地方使用相同的字符串并希望在所有位置编辑相同的字符串,则可以节省逐个编辑所有硬编码字符串的开销。

1
硬编码字符串不会直接影响性能,但会影响可维护性。
如果你硬编码一个字符串,以后想将"Click me"改为"add"或其他内容,你需要搜索整个项目来查找所有使用该字符串的地方进行更改。所以最好一直遵循strings.xml。 :)

0

如果您的应用程序不需要 本地化 支持,则使用硬编码字符串将没有问题。


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