【问题标题】:How to avoid transitive AOT compiling of clojure source files如何避免clojure源文件的传递AOT编译
【发布时间】:2016-04-15 12:15:26
【问题描述】:

我有一个使用 maven 作为构建工具的跨 Java-clojure 项目。需要对一些命名空间进行 AOT 编译。

问题是,编译需要很长时间才能完成。检查 maven 进程会得到以下观察结果:

  1. 编译时,CPU等待时间非常长(单核70-90%)。
  2. 对那个高等待线程进行采样会给出一个堆栈,其中最里面的调用是:

    at java.io.FileDescriptor.sync(Native Method)
    at clojure.lang.Compiler.writeClassFile(Compiler.java:7269)
    
  3. 检查target/classes/ 文件夹,生成了大量.class 文件,主要用于我的项目所依赖的基于clojure 的库。

我尝试过的:

  1. 指示 clojure-maven-plugin 只编译给定的命名空间。但沿依赖线的传播并未受到抑制。
  2. 明确包括给定的命名空间,并排除依赖的命名空间。依赖库仍由 AOT 进程重新编译

好吧,就在我按下“POST”按钮之前,我发现了这个issue。似乎早在 5 年前我们就有过这样的讨论,而且问题并不特定于 clojure-maven-plugin。那么这个问题有什么新变化呢?在我的机器上为我的不那么大的项目使用一次mvn clean compile 大约需要 4 分钟,我可以真正地喝杯咖啡,高枕无忧..

如果问题在不久的将来无法以任何方式得到解决,有什么建议可以减轻我的痛苦?欢迎任何想法。

【问题讨论】:

  • 只做“maven install”怎么样?
  • @dAni 需要注意的是 clean 部分。只要清理了编译的类文件,编译就会重新开始。虽然增量编译是可能的,但我们确实需要不时clean它..
  • Clojure 1.8 今天发布了 dev.clojure.org/jira/browse/CLJ-703。在我的一些项目中,我发现编译时间缩短了 33%。
  • @dAni 太棒了!这看起来确实是一个关键的性能提升。我会试一试并尽快报告。
  • 选择 1.8 后,我的 mvn clean compile 现在只用了 40 多秒!从 4 分钟开始!如果使用我的clean.sh,只需 20 多秒。

标签: clojure


【解决方案1】:

事实证明,这个问题可能还没有很好的解决方案。然而,我现在求助于这种绕行:

我现在没有运行 clean 目标,而是使用我自己的 clean.sh 脚本仅清理我自己的命名空间中的类文件。通过这样做,我的 4 分钟编译时间减少到 1 分钟多一点。

我会留下这个问题,也许有一天我们会看到更好的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多