2017-03-07 40 views
1

我創建了一個樣本類,其中包含兩個整數數組;一個排序和其他未排序。我正在打印數組的內容。用於打印排序數組的時間是打印未排序數組所需時間的兩倍。打印排序和未排序數組的時間差

參考代碼:

public class Demo { 

public static void main(String[] args) { 

    int[] array1 = {1,2,3,4,5,6,7,8,9,10}; 
    int[] array2 = {10,3,4,2,6,7,8,1,5,9}; 

    long start = System.nanoTime(); 

    for(int a:array1){ 
     System.out.println(a); 
    } 

    System.out.println("Time required by sorted array\t"+(System.nanoTime() - start)/1000000000.0); 

    start = System.nanoTime(); 
    for(int a:array2){ 
     System.out.println(a); 
    } 

    System.out.println("Time required by unsorted array\t"+(System.nanoTime() - start)/1000000000.0); 
} 

} 

輸出:

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
Time required by sorted array 3.89505E-4 
10 
3 
4 
2 
6 
7 
8 
1 
5 
9 
Time required by unsorted array 1.37727E-4 

爲什麼有時間差,而顯示的數字。此外,我讀的地方排序數組過程更快,這裏的情況是不同的。

+3

第一次部分還包括加載所有System.out類所需的時間。我敢打賭,如果您顛倒了程序的順序,先打印未排序的值,您將看到相反的行爲。對Java應用程序進行性能分析非常困難 - 網上有很多關於陷阱的資源及其解決方案。 – yshavit

+3

要擴大yshavit的評論這裏是你的例子改變的順序:http://ideone.com/I3e0Bf - 突然「未排序」更慢 – UnholySheep

+2

還有一個運行它是不夠的。你需要幾十或幾百次運行來做出這樣的聲明 – efekctive

回答

4

這根本不是你如何基準代碼。再次運行你的代碼,你會發現每次都會得到非常不同的結果。例如,這裏有幾個奔跑的我的機器上的結果:

Time required by sorted array 4.53115E-4 
Time required by unsorted array 2.0451E-4 

Time required by sorted array 3.2349E-4 
Time required by unsorted array 2.10212E-4 

Time required by sorted array 3.48198E-4 
Time required by unsorted array 1.90065E-4 

如果我反向打印循環的順序,這樣:

long start = System.nanoTime(); 

for(int a:array2){ 
    System.out.println(a); 
} 

System.out.println("Time required by unsorted array\t"+(System.nanoTime() - start)/1000000000.0); 

start = System.nanoTime(); 
for(int a:array1){ 
    System.out.println(a); 
} 

System.out.println("Time required by sorted array\t"+(System.nanoTime() - start)/1000000000.0); 

結果也會改變:

Time required by unsorted array 3.04103E-4 
Time required by sorted array 2.23136E-4 

Time required by unsorted array 3.55041E-4 
Time required by sorted array 1.99188E-4 

Time required by unsorted array 3.63783E-4 
Time required by sorted array 2.0489E-4 

因此,時間差異與數組是否排序有關,而更多的是與哪個數組首先排序有關。

正確的代碼基準測試,特別是在Java中是非常棘手的。有整個tools(和更多tools)和methodologies致力於做到這一點。