gpt4 book ai didi

java - 通过数组访问数组巨大的性能损失

转载 作者:行者123 更新时间:2023-11-30 03:03:05 27 4
gpt4 key购买 nike

让我们看一下以下两个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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com