带有菱形运算符的 Java 对象初始化糟糕的 javac 编译时间性能

标签 java collections type-inference diamond-operator

我正在使用菱形运算符来启动列表中的对象。然而,随着数组对象数量的增加,编译时间从几秒增加到几小时。我的 eclipse 自动构建使我的 eclipse 没有响应。然后我注意到这是一个 javac 问题。当我替换所有 <><String, List<Category>>编译时间回到短短几秒钟。这是我做错了什么还是只是 Java 性能问题?

这是我的代码,需要 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
      );
      }
    }

编辑: 正如 Sotirios 在评论中提到的,它似乎是 JDK 中的一个已报告问题:

类型推断指数编译性能: https://bugs.openjdk.java.net/browse/JDK-8055984

类型推理性能回归: https://bugs.openjdk.java.net/browse/JDK-8048838

最佳答案

我目前正在研究 JEP-215 Tiered attribution .这个 JEP 的目标是改进 javac 中的属性代码,并作为提高编译器性能的副作用。例如错误中列出的代码 JDK-8055984由“普通”Javac9 编译:很多时间!当前版本的分层归因在大约 2.5 秒内编译它,这要好得多。分层归因的代码尚未公开。我希望它会这么快。与此同时,这种或报告非常有用。

编辑:如果有人想尝试分层归因,仍在开发中,请查看此公告:tiered attribution for all

关于带有菱形运算符的 Java 对象初始化糟糕的 javac 编译时间性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27767857/

相关文章:

java - JVM 启动失败 : java. io.IOException : Cannot run program "/usr/libexec/StartupItemContext; error=2, No such file or directory

java - 基本文件读取到数组存储

list - 使用foldBack 将字符列表转换为字符串

haskell - 为什么类型是 [( True , [ ] ) , ( False , [ ['a' ] ] ) ] , "[ (Bool , [ [char] ] )]"?

java - Java 中的循环法

java - 为什么左侧的类型被忽略 - Jackson 反序列化

java - 从网站下载文本文件

java - list.clone 优于 new ArrayList(originalist)

java - 如果查找键是字符串,则 EnumMap 或 HashMap

ScalaIDE - 以冒号结尾的方法的奇怪之处