2015-01-04 18 views
9

私はダイヤモンド演算子を使ってリスト内のオブジェクトを開始しています。しかし、配列オブジェクトの数が増加すると、コンパイル時間は数秒から数時間に増加します。私の日食の自動ビルドは、私の日食を非応答にしました。私はそれがjavacの問題であることに気付きました。 <>をすべて<String, List<Category>>に置き換えると、コンパイル時間はほんの数秒に戻ります。これは私が間違っているのか、まさにJavaのパフォーマンス上の問題なのでしょうか?ここでダイヤモンド演算子を使ったJavaオブジェクトの初期化ひどいjavacコンパイル時のパフォーマンス

をコンパイルするためにJavaの時間を取る(またはの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 
    ); 
     } 
    } 

編集: ソティリオスはコメントで述べたように、JDKで報告された問題のようです:

型推論指数コンパイル性能: https://bugs.openjdk.java.net/browse/JDK-8055984

タイプ推論パフォーマンスの低下: https://bugs.openjdk.java.net/browse/JDK-8048838

+6

あなたはそのjavacの問題か? Eclipseはjavacの代わりに独自の増分コンパイラを使用します。 – WonderCsabo

+1

コンパイラがクラッシュしたらどういう意味ですか?スタックトレースはありますか? –

+0

mvnクリーンインストールでも、 "172のソースファイルをコンパイルする"に達したときにスタックする。 –

答えて

2

私は現在JEP-215 Tiered attributionに取り組んでいます。このJEPの目的は、javacの帰属コードを改善することと、コンパイラのパフォーマンスを改善するための副作用としてです。たとえば、バグJDK-8055984に記載されているコードは、通常のJavac9でコンパイルされています。階層化されたアトリビューションの現在のバージョンは〜2.5秒でコンパイルします。これははるかに優れています。階層別帰属のコードはまだ公開されていません。私はそれがすぐになることを願っています。その間、この種の報告は本当に便利です。

編集:誰もがまだ開発中、階層帰属に試してみることにしたい場合は、この発表をチェックしてください:tiered attribution for all

0

変更

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

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

に、これはそれをスピードアップしている場合を参照してください。私のJDK/IDE(IntelliJ)は、コードスニペットを他の方法でコンパイルしません。

+1

私はそれがより良い練習だと思います、私は変更を行いました。しかしそれは問題を解決しませんでした。 Eclipseのクラッシュやmvnのクリーンインストールには、まだ「コンパイル」の部分で数時間かかることがあります。 –

関連する問題