2015-01-04 32 views
9

Używam operatora diamentów do inicjowania obiektów na liście. Jednak wraz ze wzrostem liczby obiektów macierzy czas kompilacji wzrasta z kilku sekund do godzin. Moja kompilacja auto-eclipse spowodowała, że ​​moje zaćmienie nie odpowiadało. Zauważyłem, że jest to problem javac. Po zamianie całego <> na <String, List<Category>> czas kompilacji wraca do zaledwie kilku sekund. Czy to coś, co robię źle, czy jest to tylko problem z wydajnością Java?Inicjalizacja obiektu Java za pomocą operatora diamentowego straszny czas kompilacji javac

Tu jest mój kod, który będzie trwać Java skompilować (lub zawiesza javac v8u25):

List<Pair<String, List<Category>>> categoryMappings = null; 

    public void reloadStaticData() {     
     // Left one is the provider's category and right one is ours 
     try(UoW luow = CoreModule.getInstance(UoW.class)) { 
     CategoryRepo categoryRepo = luow.getCategoryRepo(); 
     categoryMappings = Arrays.asList(

        // Nightlife 
        new ImmutablePair<>("Bars", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get())), 
        new ImmutablePair<>("Ski-Bar", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get())), 
        new ImmutablePair<>("Bar", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get())), 
        new ImmutablePair<>("Beer", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get())), 
        new ImmutablePair<>("Pubs", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get())), 
        new ImmutablePair<>("Clubs", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get())), 
        new ImmutablePair<>("Dance", Arrays.asList(categoryRepo.findByName("Bar & Pubs").get() 
          ,categoryRepo.findByName("Clubs").get())),  
        // if I got more than 20 of these ImmutablePairs, javac crashes or takes hours to compile 
    ); 
     } 
    } 

Edit: Jak Sotirios wspomniano w komentarzach wydaje się być zgłoszony problem w JDK :

rodzaj wnioskowania wykładniczy wydajność kompilacja: https://bugs.openjdk.java.net/browse/JDK-8055984

typ wydajność wnioskowanie regresji: https://bugs.openjdk.java.net/browse/JDK-8048838

+6

jesteś pewna jego problem javac? Eclipse używa własnego przyrostowego kompilatora zamiast javac. – WonderCsabo

+1

Co masz na myśli, gdy kompilator się zawiesił? Czy masz jakiś stacktrace? –

+0

Nawet instalacja mvn clean utknie, gdy dojdzie do "Kompilowania 172 plików źródłowych do ...." –

Odpowiedz

2

Aktualnie pracuję nad JEP-215 Tiered attribution. Celem tego JEP jest poprawa kodu atrybucji w javacu i jako efekt uboczny w celu poprawy wydajności kompilatora. Na przykład kod wymieniony w błędzie JDK-8055984 jest kompilowany przez "normalne" Javac9 w: dużo czasu! Obecna wersja warstwowej atrybucji kompiluje ją w ~ 2,5 sekundy, co jest znacznie lepsze. Kod wielowierszowego atrybucji nie jest jeszcze publiczny. Mam nadzieję, że tak szybko to nastąpi. W międzyczasie tego rodzaju raporty są naprawdę przydatne.

Edit: jeśli ktoś chce dać spróbować warstwowych atrybucji, wciąż w rozwoju, prosimy o zaznaczenie tego komunikatu: tiered attribution for all

0

Zmień

List<Pair<String, List<Category>>> categoryMappings = null; 

do

List<? extends Pair<String, List<Category>>> categoryMappings = null; 

Sprawdź, czy ten przyspiesza ją. Mój JDK/IDE (IntelliJ) nie skompiluje w inny sposób fragmentu kodu.

+1

Myślę, że to jest lepsza praktyka, zrobiłem zmianę. jednak to nie rozwiązało problemu. Eclipse ulega awarii, a instalacja mvn clean nadal trwa kilka godzin w części "Kompilowanie". –