我应该比较,设置还是只设置?

时间:2015-04-18 21:18:31

标签: java

我在java中编写一个循环。

我有2个整数dest& SRC。请查看内联问题。

void test() {
    int[] arr = ..
    for (...) { //iterate over the array here.
        int src = arr[i];
        int dest= arr[j];

        if (dest != src) dest = src; //SHOULD I WRITE THIS?
            OR
        dest = src;                  //OR THIS?
        ..
    }
}

2 个答案:

答案 0 :(得分:3)

if(dest!= src)dest = src;         如果它们已经相等则有额外的比较

dest = src         如果它们已经相等则有一个额外的集合

我非常确定这些"额外内容"具有相同的复杂度O(1) 所以它真的应该没关系,我认为第二个选项(没有比较设置)看起来更清晰,但我认为在这一点上它只是一个意见问题。

答案 1 :(得分:2)

如果代码的语义正确,则应编写dest = src。为什么?如果值不相等,if子句仅设置值。但这意味着,如果该子句为假,则可以在不更改任何内容的情况下执行dest = src(您只需重新分配该值)。 if只会创建更多指令,无论如何都必须提取两个操作数。

编辑:使用此代码进行了快速测试。使用显示的版本,一次注释j = i并注释if子句。

public class Main {
    public static void main(String... args) {
        int i = Integer.parseInt(args[0]);
        int j = Integer.parseInt(args[1]);
        // if (j != i) {
        //     j = i;
        // }
        j = i;
    }
}

这是堆栈代码。

使用if

public static void main(java.lang.String...);
  Code:
     0: aload_0
     1: iconst_0
     2: aaload
     3: invokestatic  #16                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     6: istore_1
     7: aload_0
     8: iconst_1
     9: aaload
    10: invokestatic  #16                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
    13: istore_2
    14: iload_2          // <-- Fetching 1st operand
    15: iload_1          // <-- Fetching 2nd operand
    16: if_icmpeq     21 // <-- THIS is the if
    19: iload_1
    20: istore_2
    21: return

没有if

public static void main(java.lang.String...);
  Code:
     0: aload_0
     1: iconst_0
     2: aaload
     3: invokestatic  #16                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
     6: istore_1
     7: aload_0
     8: iconst_1
     9: aaload
    10: invokestatic  #16                 // Method java/lang/Integer.parseInt:(Ljava/lang/String;)I
    13: istore_2
    14: iload_1      // <-- Loading i
    15: istore_2     // <-- setting i's value to j
    16: return

如您所见,没有if的版本需要13条说明。 if需要14或16条指令。