我是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()
时,当第二次调用相同的方法时,程序的执行时间最大,程序花费的时间少于第一次调用和第三次调用方法{{1小于或等于第二个执行时间。我运行了这个程序5-6次,我得到了相同的执行时间模式。
我的问题是,当执行的代码在三次中保持相同时,为什么会发生这种情况。是否存在编译器发生的任何代码优化,或者它取决于操作系统环境。当重复执行相同的代码块时,编译器会进行什么样的优化?
答案 0 :(得分:2)
JIT (just in time) compiler编译JVM检测到的代码正在大量执行,这可以解释性能的提高。在进行此类编译时,实际上可能会有短暂的减少。
通常在性能测试中允许这种效果 - 您执行代码几千次,然后开始您的基准测试。
答案 1 :(得分:0)
循环嵌套优化是一种优化技术,它应用一组循环变换以进行局部优化或并行化。一个经典用法是减少由于某些常见线性代数算法的高速缓存重用所必需的内存访问延迟或缓存带宽。
答案 2 :(得分:0)
如果您想更准确地衡量已用时间,则必须使用System.nanoTime()而不是System.currentTimeMillis()。
波西米亚人提到的关于JIT的事情当然会出现。