Java变量声明效率

时间:2012-09-02 21:16:00

标签: java performance

据我所知,在数组的情况下,JAVA会根据数组的大小检查索引。 因此,不要在循环中多次使用array[i],最好声明一个存储array[i]值的变量,并多次使用该变量。

我的问题是,如果我有这样的课程:

public class MyClass(){

    public MyClass(int value){
      this.value = value;
    }

    int value;
}

如果我在其他地方创建了这个类的实例:(MyClass myobject = new MyClass(7)),并且我必须多次使用对象值,是否可以经常使用myobject.value或者它会更好声明一个存储该值并使用多次的变量,或者它是否相同?

3 个答案:

答案 0 :(得分:4)

在您的情况下,它不会有任何区别,因为引用myobject.value与引用新的int变量一样快速有效。

此外,JVM通常能够优化这些类型的东西,除非你拥有高性能的关键代码,否则你不应该花时间担心它。只需专注于编写清晰易读的代码。

答案 1 :(得分:2)

简短回答是肯定的(事实上,在数组的情况下,它不仅需要检查索引限制,而且要计算你要查找的引用的实际内存位置 - 在i = 7中,得到数组的基本位置并添加7个单词 - )。

答案很长,除非你真的使用那个值很多(我的意思很多)并且你因速度而受到限制,所以不值得增加复杂性码。除此之外,本地变量意味着您的JVM使用更多内存,可能会遇到缓存故障,等等。

一般来说,您应该更多地关注算法的效率(O(n)),而不是担心这些微小的事情。

答案 2 :(得分:2)

Java编译器不是bozo。 He will do that optimization for you.通常,您提供的所有选项之间的速度差异为0。

我说“通常”因为访问原始对象或本地副本并不总是相同。如果您的数组是全局可见的,而另一个线程正在访问它,则这两个表单将产生不同的结果,并且编译器无法将其中一个优化为另一个。有些东西可能会让编译器误以为可能存在问题,即使没有。然后它将不会应用法律优化。

但是,如果您没有做有趣的事情,编译器将会看到您正在做的事情并为您优化变量访问。真的,这就是编译器所做的。这就是它的用途。

您需要至少优化一个级别。这个不适合你。