我从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;
}
selectionSort
与selectionSortWorse
的时间比较(平均值为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)”,而不仅仅是“值地址”。这并不重要,但是如果重复足够可能会产生影响。