为什么调用数组的位置比变量更糟糕

时间:2018-12-19 14:35:35

标签: java sorting

我从Java开始,但是我想到了一个巨大的区别:为什么对数组的引用比将值赋给变量然后调用变量差得多? (如果这不是我的代码的问题,那么我的代码有什么问题?)

我尝试用Java实现选择排序,在这里向您展示时间。

在我看来,数组就像一个符号变量列表,所以我不知道直接调用数组项有多糟。

这是代码(下面的时间)

public static int[] selectionSort(int ... numbers) {
  int pos, value;
  int[] result = numbers.clone();
  for (int i = 0; i < result.length - 1; i++) {
    value = result[i];
    pos = i;
    for (int j = i + 1; j < result.length; j++) {
      if (result[j] < value) {
        value = result[j];
        pos = j;
      }
    }
    result[pos] = result[i];
    result[i] = value;
  }
  return result;
}

public static int[] selectionSortWorse(int ... numbers) {
  int pos, value;
  int[] result = numbers.clone();
  for (int i = 0; i < result.length - 1; i++) {
    pos = i;
    for (int j = i + 1; j < result.length; j++) {
      if (result[j] < result[pos]) {
        pos = j;
      }
    }
    value = result[pos];
    result[pos] = result[i];
    result[i] = value;
  }
  return result;
}

selectionSortselectionSortWorse的时间比较(平均10)

  • 数组长度:10000;时间33.14毫秒vs. 52.33毫秒
  • 数组长度:20000;时间127.13毫秒和207.46毫秒
  • 数组长度:50000;时间793.56毫秒和1302.48毫秒
  • 数组长度:100000;时间3096.43 ms与5072.56 ms

1 个答案:

答案 0 :(得分:2)

在访问数组元素(例如result[pos])时,与访问直接变量(例如value)相比,存在额外的开销,至少还要发生另外2件事:

  • 例如,验证范围是验证pos >= 0 && pos < result.length
  • 需要计算元素的地址,类似于“结果地址+(pos * element_size)”,而不仅仅是“值地址”。这并不重要,但是如果重复足够可能会产生影响。