首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >排除编译速度慢的故障

排除编译速度慢的故障
EN

Stack Overflow用户
提问于 2015-06-08 18:58:23
回答 3查看 9.2K关注 0票数 21

我应该怎么做才能调查和解决编译缓慢的问题

我的项目有大约100个类,编译时间超过45秒,对我来说这似乎非常慢。作为参考,我有另一个包含50个类的项目,它在3秒内编译完成。

ps:

  • 我使用maven作为构建工具。编译(-Xms500m)
  • I需要50秒左右的时间(mvn clean compile),其中45秒是用来运行-X的(通过运行javac来确认内存的大小并没有帮助maven给出更多关于我的项目的信息,但这是相当标准的,所以我不确定哪些信息是相关的。

更新

多亏了Tagir的想法,我终于找到了其中一个罪魁祸首。这个类增加了20秒的编译时间:

代码语言:javascript
复制
import org.jooq.DSLContext;
import org.jooq.Field;
import static org.jooq.impl.DSL.field;
import static org.jooq.impl.DSL.round;
import static org.jooq.impl.DSL.sum;


class Test {
  static Object fast(DSLContext sql) {
    Field<Double> a = field("a").cast(Double.class);
    return sql.select()
            .having(round(sum(a).cast(Double.class), 2).ne(0d));
  }
  static Object slow(DSLContext sql) {
    return sql.select()
            .having(round(sum(field("a").cast(Double.class)).cast(Double.class), 2).ne(0d));
  }
}

如果slow方法被注释掉,编译时间就会恢复正常。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-10 01:05:22

故障排除-一般方法

您可以从重新创建一个空项目开始,然后一个接一个地添加包,直到编译时间受到影响-这应该可以帮助您识别导致问题的包。

然后,您可以删除包中的所有类,并逐个将它们添加回来-这将帮助您找到导致问题的类。

然后,您可以从这些类中删除所有方法,并逐个将它们添加回来,直到您看到编译时间增加(您可以通过only recompiling that one class节省时间)。

具体原因

在这种情况下,根本原因似乎是javac中的错误,所以我提交了一个标记为"JEP 215: Tiered Attribution for javac"副本的bug report,目标是在Java9上修复。

同时,解决方法是在存在使用泛型类型推断的嵌套泛型方法调用时引入局部变量,但不幸的是,这并不总是有效的……

票数 9
EN

Stack Overflow用户

发布于 2015-06-09 23:28:50

Java8的一个不太为人熟知的特性是Generalized Target-Type Inference

虽然它允许编写更清晰的代码,但这需要为Javac做更多的工作。有时,这会导致类型推断问题的指数复杂度。这是一个已知的问题,但不幸的是仍未解决-请参阅JDK-8055984JDK-8067767

解决方法是在Java7兼容级别进行编译:javac -source 7,或者只是使用更简单的构造。

票数 8
EN

Stack Overflow用户

发布于 2016-05-04 03:22:01

与此相关的讨论有很多次。添加这些参考,以防其他人偶然发现这篇文章。

初步讨论:

在我的例子中,我基本上尽可能多地使用自动生成的代码。或者,你可以尝试卢卡斯在上面链接的这篇StackOverflow帖子中提到的建议。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30707387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档