性能访问静态final

时间:2011-02-02 20:41:47

标签: android performance

我有一个静态10K文件,每行都有一个单词。我需要创建一个包含所有单词的String []数组。我有两个选择:

  1. 我创建了一个静态的 final String []单词并手工编写了我代码中所有单词的硬编码。
  2. 启动时,加载文件,解析文件并创建一个包含所有单词的静态String [] words数组。
  3. 现在,我的问题是,在完成所有这些操作后,正在从数组1中访问一个单词(注意 final 关键字)明显快于数组2中的单词(没有final关键字,因为我们在运行时加载单词)。从理论上讲它有所作为吗?我们在这里谈论的是Android,而不是Java。但我对这两种情况都感兴趣。

4 个答案:

答案 0 :(得分:2)

通用Java:

JVM中没有用于数组初始化的字节码,因此编译器最终会为每个数组项生成单独的赋值语句,这会使代码膨胀。有关详细信息,请参阅here

根据您拥有的数据量,从文件加载值是最有效的方案。数组是否被声明为final是无关紧要的,因为字符串本身是不可变的。

<强>机器人:

DVM通过添加初始化数组的指令改进了JVM。所以你没有相同的代码膨胀问题。

也就是说,从文件加载东西可能是最灵活的方法。如果正确完成,您可以在必要时加载来自多个文件的值,甚至可以通过Internet加载。

答案 1 :(得分:0)

我认为没有明显的区别。当你访问它们时,它们中的两个将只是2个String数组,所以......

答案 2 :(得分:0)

如果您在构造函数中指定关键字,我相信您可以将关键字标记为static或final。因此,请确保您在静态类的构造函数中读取该文件。 (我不是100%确定Java有静态构造函数,但在C#中它可以工作,而且两者通常非常相似)。

即使你不能做到这一点,我仍然会阅读10k文件。读取字符串[]永远不会真的很贵。编译器通常会对标记为final的成员执行的任何优化技巧都可以在Java JITTER运行时在注意到字符串[]不再被更改时完成。

答案 3 :(得分:0)

使数组最终不会使其元素成为最终。与C ++相比,这是Java的缺点之一。唯一的实际效果是优化器和混淆器。根据你的描述,我很确定没有明显的区别。