【问题标题】:Why is leiningen so slow when it starts?为什么 leiningen 启动时这么慢?
【发布时间】:2014-09-23 00:04:49
【问题描述】:

我正在使用lein repl 在控制台中执行 clojure repl。 当我运行它时,它需要 15 秒以上。 当我运行java -cp clojure-1.6.0.jar clojure.main 时,只需几秒钟。

为什么lein repl 这么慢?有没有办法让它更快?

我的环境:

  • 硬件:MacBookAir
  • 操作系统:Mac OS 10.9 Mavericks
  • CPU:i7
  • 内存:8GB

【问题讨论】:

  • 它启动一个 JVM。可能只是JVM启动时间。
  • @Kungi 正如我在问题中所述,当我通过java -cp clojure-1.6.0.jar clojure.main 运行 repl 时,它开始相对较快。所以不是JVM启动时间的原因。
  • 我在我的系统上试过了,它和你的 macbook air 完全一样。你是对的lein repl 启动时间大约是原来的两倍。
  • 可能 leiningen 加载了更多必须预先编译到 JVM 中的代码。但我知道这不是一个令人满意的答案。
  • Leiningen 启动两个 JVM,并将它们连接在一起。它必须加载额外的东西才能做到这一点。您输入的提示符是与评估您的代码的 Clojure 进程不同的进程。 Leiningen 还必须解析您的项目文件,并确保一切都按需要进行设置,或者从网络上获取所需的内容。如果您仔细阅读,在 Leiningen 示例项目文件中,有一些选项可以加快速度。我认为 Leiningen 启动缓慢只是现在的生活事实之一。

标签: clojure leiningen read-eval-print-loop


【解决方案1】:

在我的例子中,cider-nrepl 插件对加载时间的贡献很大。

使用 jvisualvm 进行的快速非科学研究表明,加载和评估文件需要花费大量时间(0.10-snapshot 不是 AOT-ed),并且还有用于扫描类路径的初始化逻辑。

使用快速蹦床将启动时间减半。

在我看来,jvm 的作用并不比操作系统或文件系统大。这都是关于正在加载的代码。

【讨论】:

  • 那么总体而言,您在 Pi 上的开发设置方面获得了合理的体验吗?
【解决方案2】:

有多种方法可以缩短 lein 的启动时间。 记录在这里:

https://github.com/technomancy/leiningen/wiki/Faster

【讨论】:

    【解决方案3】:

    Leiningen 启动两个 JVM,并将它们连接在一起。它必须加载额外的东西才能做到这一点。您输入的提示符是与评估您的代码的 Clojure 进程不同的进程。 Leiningen 还必须解析您的项目文件并确保所有内容都按需要进行设置,或者如果您的 maven 配置目录中缺少任何内容,则可以从 Web 获取所需的内容。如果您仔细阅读,在Leiningen sample project file 中有一些选项可以加快速度。我认为 Leiningen 启动缓慢只是现在的生活事实之一。

    更多相关信息:

    Improving startup time of Clojure REPL with Leiningen on the Raspberry Pi

    Faster

    【讨论】:

    • 我尝试了很多不同的方法,但 lein repl 的启动时间仍然比直接通过 java 运行慢得多。我想知道通过java -cp ~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar clojure.main 的别名运行它会不会是错误的。这不会解决苹果酒的问题,但对于较小的实验来说,这会起作用,不是吗?也许我什至可以使用滴灌让它更快?
    • 我不知道,@Agzam。其他一些答案可能是相关的。
    【解决方案4】:

    您的第一个问题已得到解答,所以关于第二个问题,我猜您想要的是减少启动时间,因为您通常会加载一些在编码时更改的命名空间。可以从修改的命名空间重新加载代码,而无需使用(use 'your.namespace :reload) 退出 REPL。这样你可能只启动一次并重新加载更新的命名空间

    user=> (doc require)
    

    ...

      :reload forces loading of all the identified libs even if they are already loaded
      :reload-all implies :reload and also forces loading of all libs that the identified libs directly or indirectly load via require or use
    

    ...

    另一方面,如果您阅读 lein help repl 的输出,您将看到如何设置 REPL 服务器和客户端,这可能会减少您的启动时间

    【讨论】:

      【解决方案5】:

      如果您在项目目录中运行lein repl,它会加载您项目的源文件并启动一个 repl。即使对于小型项目,如果您的源文件引用外部依赖项,这也会增加大量时间。

      java -cp clojure-1.6.0.jar clojure.main 不会加载任何项目源文件或依赖项。

      【讨论】:

      • 有项目依赖:lein uberjar; java -cp target/*standalone.jar clojure.main
      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 1970-01-01
      • 2012-06-02
      • 2016-09-28
      • 2020-02-08
      • 2012-07-17
      • 2011-11-07
      • 2015-08-24
      相关资源
      最近更新 更多