首页 > 解决方案 > 我写了两段代码,几乎一模一样,但一个运行得比另一个快得多(Java)

问题描述

我跑了这段代码:(外循环运行100次,内循环运行10亿次。)

long l = 0;

for(int i = 0; i < 100; i++)
    for(int j = 0; j < 1000000000; j++)
        l++;

System.out.println(l);

当我运行它时,这大约需要 11-12 秒。

然后我运行了这段代码:

long l = 0;
int i = 0, j = 0;

for(; i < 100; i++)
    for(; j < 1000000000; j++)
        l++;

System.out.println(l);

每当我运行它时,这大约需要 100 毫秒(0.1 秒)。

有谁知道为什么会有很大的不同?我的理论是,对于 'i' 的每个值,内部 for 循环都必须再次初始化 j,这使它有更多的操作要做,所以它需要更长的时间是有道理的。然而,差异是巨大的(大约 100 倍),并且在其他类似的测试中,同样的事情不会发生。

如果你想自己看,我是这样计时的:

class Main {
    static long start, end;
    public static void main(String[] args) {
        start();

        long l = 0;
        int i = 0, j = 0;

        for(; i < 100; i++)
            for(; j < 1000000000; j++)
                l++;

        System.out.println(l);

        end();
        print();
    }

    public static void start() {
        start = System.currentTimeMillis();
    }

    public static void end() {
        end = System.currentTimeMillis();
    }

    public static void print() {
        System.out.println((end -  start) + " ms.");
    }
}

标签: javaloopsfor-looptime

解决方案


第二个函数仅在 i 的第一次迭代中遍历 j。此时 j 超过了 for 循环的限制并且永远不会再次运行,因为它不会在 i 的下一次迭代中重置


推荐阅读