我从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毫秒和52.33毫秒
数组长度:20000;时间127.13 ms与207.46 ms
数组长度:50000;时间793.56毫秒和1302.48毫秒
数组长度:100000;时间3096.43 ms与5072.56 ms

最佳答案

当访问数组元素(例如result[pos])时,与访问直接变量(例如value)相比会产生开销,至少还需要发生2件事:


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

10-07 16:07
查看更多