让我们看一下以下两个java方法:
static void performance1() {
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
for (int k = 0; k < 100; k++) {
a = arrayA[2];
b = arrayB[1];
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
static void performance2() {
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
for (int k = 0; k < 100; k++) {
b = arrayB[arrayA[2]];
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
第一个方法在我的系统上执行需要 209 毫秒,第二个方法需要 4295 毫秒!所以是原来的20倍。怎么会这样?据我所知,如果我声明 3 个单独的变量而不是 arrayA,我可以获得 20 倍的性能提升,因为以下方法再次执行得非常快:
static void performance3() {
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
for (int i = 0; i < 100000000; i++) {
for (int k = 0; k < 100; k++) {
b = arrayB[a];
}
}
long end = System.currentTimeMillis();
System.out.println(end - start);
}
我在这里忽略了一些明显的事情吗?差异如此之大,着实让我感到惊讶。不管怎样,谢谢你的解释:)
最佳答案
在第一个代码中,无论循环索引是什么,a 始终设置为 5,b 始终设置为 5,因此编译器完全消除了循环,因此最终结果实际上是这样的:
int a=0;
int b=0;
int[] arrayA = { 3, 4, 5 };
int[] arrayB = { 4, 5, 6, 3, 4, 5, 6, 7, 8, 4 };
long start = System.currentTimeMillis();
a = 5;
b = 5;
long end = System.currentTimeMillis();
System.out.println(end - start);
关于java - 通过数组访问数组巨大的性能损失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35435941/