2013-08-25 79 views
0

我在Java中使用這種代碼,使用兩種不同類型的循環。在這段代碼中,爲什麼第二個循環比第一個循環慢?

public class Test { 
    public static void main(String[] args){ 
     long fl = 0, wl = 0; 
     int i = 0; 
     int a = 0; 
     long start = 0, stop = 0; 

     start = System.currentTimeMillis(); 
     while(i<2000000000){ 
      if(i%2 == 0) 
       a++; 
      else 
       a--; 
      i++; 
     } 
     stop = System.currentTimeMillis(); 
     wl = stop-start/2; 
     System.out.println("\nWhile loop = "+wl); 

     i = 0; 
     a = 0; 
     start = 0; 
     stop = 0; 

     start = System.currentTimeMillis(); 
     for(;i<2000000000;){ 
      if(i%2 == 0) 
       a++; 
      else 
       a--; 
      i++; 
     } 
     stop = System.currentTimeMillis(); 
     fl = stop-start/2; 
     System.out.println("For loop = "+fl); 

     System.out.println("Difference = "+(fl-wl)); 
    } 
} 

現在,多次運行該程序後,我得出的結論是,第二個循環總是執行比第一循環慢。起初,我認爲它與一個for循環和另一個while循環有關,但即使當我顛倒了順序時,第二個循環仍然執行得更慢。這是一個示例運行的輸出。

While loop = 688721817947 
For loop = 688721824295 
Difference = 6348 

現在,爲什麼會發生這種情況。

+1

你真的想嘗試解釋一個小於'0.000001%'的差異嗎? – dasblinkenlight

回答

0

這種差別沒有意義,因爲6348/688721824295 aprox 9-E9。也就是說,小於1-E6%。

任何事情都可能導致不同,從操作系統處理來自另一個進程的線程或防病毒軟件或導致干擾的宇宙射線。這就好比爲什麼車A在1小時內製造路線,而另一輛車則在1小時和1百萬分之一秒內製造出路線。

1

的區別在於真的是可以忽略不計,這是很難甚至無法確定什麼原因造成的。你的兩個循環的字節碼是相同的:

while -loop:

21: goto   43 
    24: iload   5 
    26: iconst_2  
    27: irem   
    28: ifne   37 
    31: iinc   6, 1 
    34: goto   40 
    37: iinc   6, -1 
    40: iinc   5, 1 
    43: iload   5 
    45: ldc   #22     // int 2000000000 
    47: if_icmplt  24 

for -loop:

104: goto   126 
107: iload   5 
109: iconst_2  
110: irem   
111: ifne   120 
114: iinc   6, 1 
117: goto   123 
120: iinc   6, -1 
123: iinc   5, 1 
126: iload   5 
128: ldc   #22     // int 2000000000 
130: if_icmplt  107 
6

你計算基於

fl = stop-start/2; 
你的時間

由於operator precedence

fl = stop - (start/2) 

這不是你想要什麼,我想,作爲執行這100毫秒後會引起你的fl變量是50ms的「長」((stop + 100) - ((start + 100)/2) = stop - (start/2) + 50)。這可能是第二個總是「慢」的原因。

+0

688721817947毫秒已超過20年,使原始輸出明顯錯誤。 –

相關問題