【发布时间】:2015-08-22 19:34:42
【问题描述】:
我应该如何调查和解决编译缓慢的问题?
我的项目有大约 100 个类,编译时间超过 45 秒,这对我来说似乎很慢。作为参考,我有另一个项目,它包含 50 个类,可在 3 秒内编译。
ps:
- 我使用 maven 作为构建工具。 maven 编译需要大约 50 秒 (
mvn clean compile),其中 45 秒用于运行 javac(通过使用-X选项运行确认)。 - 增加内存量没有帮助 (
-Xms500m) - 我可以提供有关我的项目的更多信息,但这是相当标准的,所以我不确定哪些信息是相关的。
更新
多亏了 Tagir 的想法,我终于找到了罪魁祸首之一。这个类增加了 20 秒的编译时间:
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 方法被注释掉,编译时间恢复正常。
【问题讨论】:
-
您是否尝试过使用
-X标志进行构建,这将为您提供依赖报告 -
您的项目中是否有任何自动生成的类?您是否尝试过部分重新编译它(例如,手动删除属于一半包的类文件,重新编译并测量时间)以缩小问题范围?有可能一门或多门课程会减慢整个过程。
-
@KennethClark 使用 -X 显示传递给 javac 的参数,然后挂起 45 秒,然后打印“构建成功”...
-
@TagirValeev 事实上,我找到了一个将编译时间增加 25 秒的类(请参阅我的编辑)...
标签: java performance compilation javac