Java 性能提示问题 public void zero(){ 整数和=0; 对于(int i=0;i

Java 性能提示问题 public void zero(){ 整数和=0; 对于(int i=0;i,java,android,Java,Android,根据,在上面的代码中,零是较慢的。但我不明白为什么?嗯,我还没有学到那么深,但我知道length是字段而不是方法。所以,当循环检索其值时,它与从局部变量检索有什么不同?一旦初始化,数组长度总是固定的。我遗漏了什么?我想这是因为在0时,他总是需要从mArray检索信息,而在one中,他可以访问这些信息。这意味着,zero需要两种“方法”: 玛丽通道酒店 访问万里酒店 但是one只需要一个“方法”: 存取透镜 public void zero(){ 整数和=0; 对于(int i=0;i

根据,在上面的代码中,零是较慢的。但我不明白为什么?嗯,我还没有学到那么深,但我知道
length
是字段而不是方法。所以,当循环检索其值时,它与从局部变量检索有什么不同?一旦初始化,数组长度总是固定的。我遗漏了什么?

我想这是因为在
0时,他总是需要从
mArray
检索信息,而在
one
中,他可以访问这些信息。这意味着,
zero
需要两种“方法”:

  • 玛丽通道酒店
  • 访问万里酒店
  • 但是
    one
    只需要一个“方法”:

  • 存取透镜
  • public void zero(){
    整数和=0;
    对于(int i=0;i
    在这里,如果您查看为每次迭代计算的for循环数组长度,则会降低性能 表演

      public void zero() {
        int sum = 0;
        for (int i = 0; i < mArray.length; ++i) {
            sum += mArray[i].mSplat;
        }
    }
    
    public void one(){
    整数和=0;
    Foo[]localArray=mArray;
    int len=localArray.length;
    对于(int i=0;i

    在这种情况下,长度在for循环之前计算,然后在循环中使用。

    在第一个示例中,JVM需要首先获取对数组的引用,然后访问其长度字段

    在第二个示例中,它只访问一个局部变量


    在桌面JVM上,这通常是经过优化的,两种方法是等效的,但Android的JVM似乎没有做到这一点。。。然而…

    这是一个范围问题。访问实例变量比访问方法变量慢,因为它不存储在相同的内存位置。(因为方法变量可能会被更频繁地访问)


    len也一样,但有一个额外的优化<无法从方法外部更改code>len
    ,编译器可以看到它永远不会更改。因此,它的值更可预测,循环可以进一步优化。

    在JIT优化代码之前,第一个示例在每个循环上都有更多的工作要做。一旦代码被编译,它应该是相同的。(在OpenJDK上)
      public void zero() {
        int sum = 0;
        for (int i = 0; i < mArray.length; ++i) {
            sum += mArray[i].mSplat;
        }
    }
    
      public void one() {
        int sum = 0;
        Foo[] localArray = mArray;
        int len = localArray.length;
    
        for (int i = 0; i < len; ++i) {
            sum += localArray[i].mSplat;
        }
    }