2013-06-17 17 views
8

This question prowadzić mnie, aby zrobić kilka badań:Null/Przedmiot i Null/Null sprawność porównanie

public class Stack 
{ 
    public static void main(String[] args) 
    { 
     Object obj0 = null; 
     Object obj1 = new Object(); 
     long start; 
     long end; 
     double difference; 
     double differenceAvg = 0; 

     for (int j = 0; j < 100; j++) 
     { 
      start = System.nanoTime(); 

      for (int i = 0; i < 1000000000; i++) 
       if (obj0 == null); 

      end = System.nanoTime(); 
      difference = end - start; 
      differenceAvg +=difference; 
     } 

     System.out.println(differenceAvg/100); 
     differenceAvg = 0; 

     for (int j = 0; j < 100; j++) 
     { 
      start = System.nanoTime(); 

      for (int i = 0; i < 1000000000; i++) 
       if (null == obj0); 

      end = System.nanoTime(); 
      difference = end - start; 
      differenceAvg +=difference; 
     } 

     System.out.println(differenceAvg/100); 
     differenceAvg = 0; 

     for (int j = 0; j < 100; j++) 
     { 
      start = System.nanoTime(); 

      for (int i = 0; i < 1000000000; i++) 
       if (obj1 == null); 

      end = System.nanoTime(); 
      difference = end - start; 
      differenceAvg +=difference; 
     } 

     System.out.println(differenceAvg/100); 
     differenceAvg = 0; 

     for (int j = 0; j < 100; j++) 
     { 
      start = System.nanoTime(); 

      for (int i = 0; i < 1000000000; i++) 
       if (null == obj1); 

      end = System.nanoTime(); 
      difference = end - start; 
      differenceAvg +=difference; 
     } 

     System.out.println(differenceAvg/100);  
    } 
} 

enter image description here

styczna do other post, to warto zauważyć, jak wiele szybciej porównanie jest gdy Object że porównujemy jest zainicjowany. Pierwsze dwie liczby w każdym wyjściu to: Object, null, a ostatnie dwie cyfry są po zainicjowaniu Object. Wykonałem 21 dodatkowych wykonań programu, we wszystkich 30 wykonaniach, porównanie było znacznie szybsze po zainicjowaniu Object. Co tu się dzieje?

+0

Co to jest JVM? – fge

+0

Ciekawe, można oczekiwać, że będzie działać odwrotnie. –

+1

Używam Java 7.11. Pomyślałem, że to też będzie na odwrót. –

Odpowiedz

3

Przeniesienie dwóch ostatnich pętli na początek daje takie same wyniki, więc porównania nie mają znaczenia.

Chodzi o rozgrzewkę kompilatora JIT. Podczas pierwszych 2 pętli java rozpoczyna się od interpretowania kodu bajtowego. Po kilku iteracjach ustala, że ​​ścieżka kodu jest "gorąca", więc kompiluje ją do kodu maszyny i usuwa pętle, które nie mają żadnego efektu, więc zasadniczo mierzysz arytmetykę System.nanotime i double.

Nie jestem pewien, dlaczego dwie pętle są wolne. Myślę, że po znalezieniu dwóch gorących ścieżek decyduje się zoptymalizować całą metodę.

+0

Kiedy umieściłem dwie ostatnie pętle z przodu, wyniki są następujące: a, b, c, d, gdzie a, b, c >> d. –

+1

@ SteveP. Czy jesteś pewien, że zrobiłeś to poprawnie, z "differenceAvg = 0;" w razie potrzeby? – zch

+0

dobre połączenie. Masz rację. –

Powiązane problemy