2016-03-30 18 views
0

'u farklı zaman süresi gerektirir. Benzer bloklarla yürütme süresini kontrol etmeye çalışıyordum. Örnek kod ve çıkış aşağıdadırAynı kod bloğu,

,

public class Tester { 

    public static void main(String[] args) { 
     System.out.println("Run 1"); 
     List<Integer> list = new ArrayList<>(); 
     int i = 0; 
     long st = System.currentTimeMillis(); 
     while (++i < 10000) { 
      list.add(i); 
     } 
     System.out.println("Time taken :" + (System.currentTimeMillis() - st)); 

     System.out.println("Run 2"); 
     int j = 0; 
     List<Integer> list2 = new ArrayList<>(); 
     long ST = System.currentTimeMillis(); 
     while (++j < 10000) { 
      list2.add(j); 
     } 
     System.out.println("Time taken :" + (System.currentTimeMillis() - ST)); 

     System.out.println("Run 3"); 
     int k = 0; 
     List<Integer> list3 = new ArrayList<>(); 
     long ST2 = System.currentTimeMillis(); 
     while (++k < 10000) { 
      list3.add(k); 
     } 
     System.out.println("Time taken :" + (System.currentTimeMillis() - ST2)); 
    } 
} 

Çıktı

Run 1 
Time taken :6 
Run 2 
Time taken :3 
Run 3 
Time taken :1 

Neden yürütme farklı zaman alıyorum?

+3

Yanıtınız programının Her geçiş için değişir muhtemelen olacaktır .. Neden tam olarak aynı değerleri bekliyoruz .. Yan notu: Bu alınan zamanın kıyaslanması için doğru yol değildir. – TheLostMind

+0

Bu ortam bağımlıdır, yürütme süresi için herhangi bir denetiminiz yoktur, bu ortamlar için farklılık gösterebilir. Ayrıca her koşuda farklı zaman kazanabilirsiniz. Ex Ben 1 Zaman alınan kod Run sonucunu şu olsun: Alınan 2 Zaman 1 çalıştırın: 0 Yarışı 3 Zaman alınan: 1 –

+0

@TheLostMind ben bu tür davranışları fark ve meraklandırdın edildi. Çevresel faktörlerin bu davranışa nasıl yol açtığını açıklarsanız harika olur. – Kajal

cevap

1

Bu muhtemelen dizi listesinde tam zamanında derleme ve etkin nokta optimizasyonu yapmak içindir, ancak% 100 emin olamazsınız.

Bunun dışında, örneklem büyüklüğünüzün çok küçük olması önemlidir.

+0

Koşulu değiştirdiğimde (değişken <10000), yürütme aynı davranır. – Kajal

+1

Daha ilginç sonuçlar için 10000000 gibi numaraları deneyin. Belli bir noktaya kadar, yürütme işleminin daha hızlı gerçekleşeceğini göreceksiniz, daha sonra bellek yönetimi sorunları nedeniyle tekrar yavaşlayacak. – mtj

1

a) java kodu kodunda yapılan bazı iyileştirmeler baytkoduna derlenmiştir, zaten bu sonraki her benzer operasyon jvm kadar iyi yürütme zamanı vardır) senin gözlemlerle

b ilgisi olmayabilir Örneğin JVM tembel yükleme veya CPU önbellekleme nedeniyle bu işlem için "ısındı". Java Microbenchmark demetini (JMH) kontrol karşılaştırmayı deneyin isterseniz

c)