繁体   English   中英

性能访问静态final

[英]Performance accessing static final

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

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

现在,我的问题是,在完成所有这些之后,从数组1中获取一个单词(注意最终关键字)明显快于数组2中的单词(没有final关键字,因为我们在运行时加载单词)。 从理论上讲它有所作为吗? 我们在这里谈论的是Android,而不是Java。 但我对这两种情况都很感兴趣。

通用Java:

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

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

安卓:

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM