为什么我的循环方法变得越来越快?

问题描述:

我试图记录一个方法完成所需的时间。我原本是对整个方法进行计时,但数字看起来有点偏离,所以我决定每次单独通过for循环。为什么我的循环方法变得越来越快?

奇怪的是,随着循环的进行,入队操作似乎每次都会变得更快更快。 q.enqueue()的每个调用都将增加的字符串(“String1”,“String2”,....等)排入链表队列。

如果我让num = 100,每个过程大约需要4,000纳秒。但是如果我将num数增加到100,000,我可以看到前几百次再次使用大约4,000次,但是它们逐渐变得更快更快,最后一百次或者是316纳秒或者是0纳秒。

我知道使用nanotime不会100%准确,但随着循环的进行它显然变得更快。

这里发生了什么?

public static void enqueueLoop(int num, Queue q){  
    for (int i=0;i<num;i++){ 
     long start, enqueueTime; 

     start = System.nanoTime(); 
     q.enqueue("String" + (i+1)); 
     qTime = System.nanoTime() - start; 

     System.out.println("Enqueue Operation took: " + NumberFormat.getInstance().format(qTime) + " nanoseconds");  
    } 
} 

的JIT(即时编译器)踢在看到该代码被重用了很多后,并将其编译为本地代码。