Java中for循环的执行时间不同

4

我是Java的新手。我已经完成了以下编码。

class TimeComplex{
    public static void main(String []args){
        long startTime, stopTime, elapsedTime;

        //first call
        startTime = System.currentTimeMillis();
        System.out.println("\nstart time : " + startTime + "\n");
        calcForLoop();
        stopTime = System.currentTimeMillis();
        System.out.println("stop time : " + stopTime + "\n");
        elapsedTime = stopTime - startTime;
        System.out.println("\t1st loop execution time : " + elapsedTime+ "\n");

        //second call
        startTime = System.currentTimeMillis();
        System.out.println("start time : " + startTime + "\n");
        calcForLoop();
        stopTime = System.currentTimeMillis();
        System.out.println("stop time : " + stopTime + "\n");
        elapsedTime = stopTime - startTime;
        System.out.println("\t2nd loop execution time : " + elapsedTime + "\n");

        //third call
        startTime = System.currentTimeMillis();
        System.out.println("start time : " + startTime + "\n");
        calcForLoop();
        stopTime = System.currentTimeMillis();
        System.out.println("stop time : " + stopTime + "\n");
        elapsedTime = stopTime - startTime;
        System.out.println("\t3rd loop execution time : " + elapsedTime + "\n");
    }

    static void calcForLoop(){
        for(long i = 12_85_47_75_807L; i > 0; i--);
    }
}

该代码运行了一个长时间的for循环只是为了增加程序的执行时间。第一次调用calcForLoop()方法时,程序的执行时间最长;当第二次调用相同方法时,程序所需时间比第一次更短,并且第三次调用calcForLoop()方法所需时间小于或等于第二次执行时间。我运行了这个程序5-6次,得到了相同的执行时间模式。 This is the output of my program.

我的问题是,当要执行的代码对于所有三次调用都保持相同时,为什么会出现这种情况?编译器是否进行了任何优化,或者它取决于操作系统环境?在像本例中重复执行相同代码块时,编译器进行什么样的优化?

3个回答

2
JIT(即时编译器)会对JVM检测到大量执行的代码进行编译,这可以提高性能。实际上,在进行这种编译时性能可能会短暂地降低

在性能测试中通常要考虑这种影响-您需要多次执行代码,然后再开始基准测试。


0
循环嵌套优化是一种优化技术,它应用一组循环变换进行局部性优化或并行化。一个经典的用法是为了减少某些常见线性代数算法的缓存重用所必需的内存访问延迟或缓存带宽。


你能让解释更简单一些吗?循环嵌套优化和缓存带宽是什么? - iammurtaza

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接