Java 使用菱形运算符初始化对象糟糕的 javac 编译时性能
Java object initialization with diamond operator terrible javac compile time performance
我正在使用菱形运算符来启动列表中的对象。然而,随着数组对象数量的增加,编译时间从几秒增加到几小时。我的 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
改变
List<Pair<String, List<Category>>> categoryMappings = null;
至
List<? extends Pair<String, List<Category>>> categoryMappings = null;
看看这是否加快了速度。我的 JDK/IDE (IntelliJ) 不会编译您的代码片段。
我目前正在研究 JEP-215 Tiered attribution. The goal of this JEP is to improve the attribution code in javac, and as a side effect to improve the compiler's performance. For example the code listed in bug JDK-8055984 由 "normal" Javac9 编译:很多时间!当前版本的分层归因在大约 2.5 秒内编译它,这要好得多。分层归因的代码尚未 public。我希望它会这么快。同时这种或报告真的很有用。
编辑:如果有人想尝试分层归因,仍在开发中,请查看此公告:tiered attribution for all
我正在使用菱形运算符来启动列表中的对象。然而,随着数组对象数量的增加,编译时间从几秒增加到几小时。我的 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
改变
List<Pair<String, List<Category>>> categoryMappings = null;
至
List<? extends Pair<String, List<Category>>> categoryMappings = null;
看看这是否加快了速度。我的 JDK/IDE (IntelliJ) 不会编译您的代码片段。
我目前正在研究 JEP-215 Tiered attribution. The goal of this JEP is to improve the attribution code in javac, and as a side effect to improve the compiler's performance. For example the code listed in bug JDK-8055984 由 "normal" Javac9 编译:很多时间!当前版本的分层归因在大约 2.5 秒内编译它,这要好得多。分层归因的代码尚未 public。我希望它会这么快。同时这种或报告真的很有用。
编辑:如果有人想尝试分层归因,仍在开发中,请查看此公告:tiered attribution for all