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

标签 java arrays performance

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

相关文章:

java - 两个集合的左外连接

java - StAX - 将 Base64 字符串从 xml 读取到数据库中

java - 使用mapstruct从字符串到枚举

sql - PostgreSQL 不使用部分索引

MySQL 执行查询太慢

java - jetty 间歇性崩溃的问题

PHP:用逗号分隔数组

php - 如何将sql查询与php数组结合起来?

c# - 比较两个列表时提高性能

PHP - 根据字段值划分多维数组