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 次,我得到了相同的执行时间模式。这是我的程序的输出。

我的问题是为什么当要执行的代码在所有三个时间内都保持不变时会发生这种情况。编译器是否进行了任何代码优化,或者它取决于操作系统环境。当像这种情况下重复执行相同的代码块时,编译器会进行什么样的优化?

4

3 回答 3

2

JIT (即时)编译器编译 JVM 检测到正在执行的代码,这是性能提高的原因。在进行此类编译时,实际上可能会出现短暂的性能下降。

通常在性能测试中允许这种影响 - 您执行代码几千次,然后开始您的基准测试。

于 2013-07-07T09:31:55.947 回答
0

循环嵌套优化是一种优化技术,它应用一组循环转换以达到局部优化或并行化的目的。一种经典用法是减少内存访问延迟或由于某些常见线性代数算法的缓存重用而需要的缓存带宽。

于 2013-07-07T09:39:57.680 回答
0

如果您想更准确地测量经过的时间,您必须使用System.nanoTime()而不是使用System.currentTimeMillis()

当然,Bohemian 提到的关于 JIT 所做的事情也会浮出水面。

于 2013-07-07T09:48:12.240 回答