2011-02-02 48 views
3

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

  1. 我手工创建一个静态最终的String []字和硬编码在我的代码的所有单词。
  2. 在启动时,加载文件,解析它并创建一个包含所有单词的静态String []单词数组。

现在,我的问题是,这一切都完成后,从阵列1(注意最终关键字)明显加快从阵列2(无final关键字accesing一个字一个字,因为我们加载在运行时的话)。理论上它有所作为?我们在这里专门讨论Android,而不是Java。但我对这两种情况都感兴趣。

+0

为什么不让数组2最终? – 2011-02-02 20:44:23

+0

难道你没有办法在不同的设备上尝试/基准测试吗?考虑到新版本(以及新的vm版本)推出的速度,我认为你不应该对这件事感到困扰 - 只需要按照你喜欢的方式进行编码即可。 – foxx1337 2011-02-02 20:44:58

回答

2

通用的Java:

存在用于在JVM数组初始化没有字节码,所以编译器最终产生用于每一个数组项,其涨大的个体代码的赋值语句。有关更多信息,请参阅here

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

机器人:

的DVM通过添加用于初始化数组的指令在JVM上得到改善。所以你没有相同的代码膨胀问题。

也就是说,从文件加载东西可能是最灵活的方法。如果正确完成,您可以根据需要从多个文件加载值,即使是在Internet上。

0

我不认为有明显的差异。当你将访问他们,他们两个人将只是2字符串数组,所以......

0

我相信你可以标记关键字为静态或最终,如果你在构造函数中分配给它。所以,只要确保您在静态类的构造函数中读取了该文件即可。 (我不是100%确定Java具有静态构造函数,但在C#中这是有效的,而且两者往往非常相似)。

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

0

制作数组最终不会使其元素最终。与C++相比,这是Java的缺点之一。唯一的实际效果是使用优化器和混淆器。用你所描述的,我很确定没有明显的差异。