2013-05-27 12 views
5

Ho un semplice sotto programma che scorre attraverso una matriceTempo totale richiesto da un ciclo per completare sempre diverso per ogni esecuzione

Integer [] intArray = new Integer[20000]; 
    int index=0; 
    for(int i=10000; i>=0; i--){ 
     intArray[index]=i; 
     index++; 
    } 

    long startTime = System.currentTimeMillis(); 
    for(Integer t : intArray){ 

     System.out.println(t); 
    } 
    long endTime = System.currentTimeMillis(); 
    long consumedTime = endTime-startTime; 
    System.out.println("Consumed time "+ consumedTime); 

ottengo sempre diversi valori di tempo consumato come 743, 790, 738, 825 , 678.

Perché il tempo impiegato da ciclo for è sempre diverso per ogni esecuzione.

Nota Sto eseguendo questo codice all'interno di un metodo principale. Il mio sistema operativo è Ubuntu e il processore è a 32 bit.

+1

Esempio di cose che possono andare storte quando si misura il tempo impiegato da un pezzo di codice Java: http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark- in-java – assylias

risposta

1

Questo perché il sistema operativo commuta le attività ed esegue migliaia di miliardi di operazioni simultanee mentre si esegue il programma java. Il tuo programma può essere veloce se il sistema operativo non sta elaborando molto quando lo hai eseguito, e può anche essere lento quando il sistema operativo è occupato.

In altre parole, il sistema operativo esegue un insieme diverso di attività simultanee ogni volta che il programma viene eseguito, tempi di esecuzione diversi.

4

Perché il tuo programma non è l'unica cosa in esecuzione sulla macchina. Il sistema operativo stesso, tutte le altre app, ecc., Prendono anche il tempo della CPU e non sempre lo stesso numero.

0

Perché Java non promette tempi di esecuzione. In un sistema operativo moderno ci sono un sacco di cose in corso contemporaneamente.

Anche se i tempi non sono gli stessi, non vedo molte variazioni.

2

Non c'è un orario specifico per i programmi Java. Dipende tutto ciò che è in esecuzione sulla macchina. Inoltre, dal momento che stai usando Integer ci vuole più tempo. Se solo le differenze native saranno probabilmente inferiori.

0

Il profilo di un programma Java in modo affidabile è tutt'altro che banale. Oltre alle variazioni causate da altri processi sulla tua macchina che fanno le loro cose, già evidenziate nelle altre risposte, ottieni anche il non determinismo a causa della garbage collection e degli effetti interessanti della tua macchina virtuale, se ha un compilatore Just-In-Time.

Nel tuo esempio, la garbage collection non è davvero un problema, ma la compilazione JIT può benissimo far sì che le prime iterazioni del ciclo siano significativamente più lente delle successive migliaia di volte. È quindi sbagliato dividere il tempo totale per il numero di iterazioni per ottenere una buona approssimazione del tempo medio per iterazione.

Per evitare questo effetto, è necessario "esercitare" il corpo del circuito un numero di volte prima di iniziare a misurare.