2013-08-04 11 views
5

Ten kod działa zgodnie z oczekiwaniami? Skie „Średnia ilość tras: 0,99864197”pobliżu pustej Java dla pętli działa dziwnie

import java.util.Random; 

public class A { 
    public static void main(String[] args) { 
     int min = -30; 
     int max = 1; 
     test(min, max); 
    } 
    static void test(int min, int max){ 
     int count = 0; 
     Random rand = new Random(0); 
     for(int j = 0; j < 2097152; j++){ 
      int number = min + rand.nextInt(max-min+1); 
      for(int i = 0; i < number; ++i) { 
       System.out.print(""); 
       count++; 
      } 
     } 
     System.out.println("Average Number of Runs: " + count/65536F); 

    } 
} 

ten kod, który należy wydrukować dokładnie taki sam numer, ale zamiast tego wyświetla losową liczbę ujemną .

import java.util.Random; 

public class A { 
    public static void main(String[] args) { 
     int min = -30; 
     int max = 1; 
     test(min, max); 
    } 
    static void test(int min, int max){ 
     int count = 0; 
     Random rand = new Random(0); 
     for(int j = 0; j < 2097152; j++){ 
      int number = min + rand.nextInt(max-min+1); 
      for(int i = 0; i < number; ++i) { 
       //System.out.print(""); 
       count++; 
      } 
     } 
     System.out.println("Average Number of Runs: " + count/65536F); 

    } 
} 

Czy istnieje pewna optymalizacja, która dzieje się w java dla pętli?

Uwagi:

  1. Używam jdk1.6.0_45.
  2. W normalnym użyciu nowy losowy miałby lepsze ziarno.
  3. min i max powinny być dowolną liczbą.
+0

Wydaje mi się, że pamiętam, że jest to duplikat, ale podejrzewam, że nie będę mógł go znaleźć. * Myślę * że jest to błąd JIT w wersji 1.6, który został naprawiony w Javie 7. Czy możesz wypróbować Java 7? –

+0

@JonSkeet Właśnie próbowałem tego w Javie 7, i to działało idealnie. – tbodt

+0

Uruchamianie kodu w jre 7u25 wydaje się naprawić problem, więc wydaje się, że jest to błąd w Javie 6. Ten rodzaj bani, odkąd całkiem garstka ludzi w społeczności Minecrafta, wydaje się nie wiedzieć, jak aktualizować i ten kod jest częścią Modyfikacji Gry, nad którą pracowałem ... Również @ Jon Skeet, czy możesz opublikować odpowiedź, aby oznaczyć ją jako zaakceptowaną? –

Odpowiedz

1

wierzę, że jest to błąd w obsłudze JIT bardzo ciasnych pętli w niektórych wersjach Java 6. To może być bug 6196102 lub bug 6357124.

Aktualizacja do Java 7 powinna zadziałać, chociaż doceniam to, że niewiele pomaga w twojej sytuacji. Może się okazać, że dodanie "wygląda na to, że nie jest no-op, ale robi coś, czego nie obchodzi" wywołanie metody w pętli rozwiązuje problem. Na przykład można zsumować wszystkie wartości i i następnie wydrukować je do niektórych dzienników diagnostycznych, aby je zignorować.

0

Działa tutaj dobrze na openjdk 1.7.0_25 fedora-2.3.10.4.fc19-x86_64. Powinieneś zaktualizować swoją wersję Java lub upewnić się, że Twój problem jest rzeczywiście zgodny z podanym kodem.