1

我想知道在 array[i] 处访问数次值或将值存储为新变量 (v=array[i]) 并多次访问变量 v 是否需要更多成本?

例如(在java中),最好写:

int [] array = {1,2,3,4,5};

for(int i=0;i<5;i++){
    if (array[i]<0){
        System.out.println("negativ");
    }else if(array[i]>0){
        System.out.println("positiv");
        if (array[i]==42){
            System.out.println("great answer");
        }
    }else{
        System.out.println("zero");
    }
}

或者

int [] array = {1,2,3,4,5};
int v;

for(int i=0;i<5;i++){
    v = array[i];
    if (v<0){
        System.out.println("negativ");
    }else if(v>0){
        System.out.println("positiv");
        if (v==42){
            System.out.println("great answer");
        }
    }else{
        System.out.println("zero");
    }
}

谢谢您的帮助。

4

4 回答 4

1

第二种形式最终会多占用两个字节:

  34: istore_2
  35: iload_2

变量访问最终成为 iaload 与 iload_2 - 差别不大。如果您有足够多的变量(超过 4 个)必须使用 iload (index) 而不是 iload_,那么您会看到第二种形式的更大代码。

明确地说:您不会通过引入变量来保存任何内容,实际上是添加指令(设置变量的位置)。

于 2017-06-12T23:54:15.487 回答
0

JVM 会将两者优化为同一事物,因此没有区别。喜欢最易读的。

于 2017-06-13T00:19:23.017 回答
0

这两种风格都有其优点和缺点
。对于array[i]访问来说,阅读起来可能有点麻烦,但这是一个更安全的选择。在您的示例中,您仅从数组中读取,请考虑您也必须编写的情况。您最终可能只是更新v,这可能被证明是一个非常昂贵的错误!

要注意的另一点是您的示例是关于原始数组的,因此我猜存储/访问开销可以忽略不计

于 2017-06-12T23:48:21.700 回答
0

两者都不。Java 语言对此进行了增强的 for 循环优化:

int [] array = {1,2,3,4,5};

for(int v: array){
    if (v<0){
        System.out.println("negativ");
    }else if(v>0){
        System.out.println("positiv");
        if (v==42){
            System.out.println("great answer");
        }
    }else{
        System.out.println("zero");
    }
}
于 2017-06-12T23:58:15.910 回答