为什么Leiningen启动时如此缓慢?

14

我正在使用 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

1
它启动了一个JVM。可能只是JVM启动时间。 - Kungi
@Kungi 正如我在问题中所述,当我通过 java -cp clojure-1.6.0.jar clojure.main 运行 repl 时,它启动得相对较快。因此这不是由于 JVM 启动时间引起的。 - ntalbs
我在我的系统上尝试了一下,它正好和你的 MacBook Air 一模一样。你是正确的,“lein repl” 启动大约需要两倍的时间。 - Kungi
可能是因为Leiningen需要预先将更多的代码编译到JVM中。但我知道这并不是一个令人满意的答案。 - Kungi
1
Leiningen启动了两个JVM,并将它们连接在一起。为此,它必须加载额外的内容。您输入的提示符是与Clojure进程评估您的代码不同的进程。Leiningen还必须解析您的项目文件,并确保一切都按照要求设置,或者从Web获取所需内容。在Leiningen示例项目文件中,如果仔细阅读,可以找到一些可以加快速度的选项。我认为Leiningen启动缓慢只是目前生活的事实之一。 - Mars
显示剩余2条评论
5个回答

10

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

更多相关信息:

改善Raspberry Pi上使用Leiningen的Clojure REPL的启动时间

更快


我尝试了许多不同的方法,但是lein repl的启动时间仍然比直接通过java运行要慢得多。我在想是否通过别名运行java -cp ~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar clojure.main会有问题。这对于cider来说并不能解决问题,但对于小型实验而言可以工作,不是吗?也许我甚至可以使用drip来使它更快? - iLemming
我不知道,@Agzam。其他答案可能会有相关的内容。 - Mars

4
如果您在项目目录中运行lein repl,它将加载您项目的源代码文件,并启动一个repl。即使对于一个小项目,如果您的源代码文件引用外部依赖项,这也会增加相当多的时间。但是java -cp clojure-1.6.0.jar clojure.main不会加载任何项目源代码文件或依赖项。

有项目依赖项:lein uberjar; java -cp target/*standalone.jar clojure.main - Aaron Blenkush

4

2

你的第一个问题已经得到了回答,所以关于第二个问题,我猜你想要减少启动时间,因为你通常会加载一些在编码过程中正在更改的命名空间。可以使用(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服务器和客户端,这可能会缩短启动时间。


1
在我的情况下,cider-nrepl插件显着地增加了负载时间。
使用jvisualvm进行快速的非科学研究显示,大量时间用于加载和评估文件(0.10快照未AOT编译),还有扫描类路径的init逻辑。
使用快速跳板将启动时间减半。
在我看来,JVM在代码被加载方面的作用并不比操作系统或文件系统更重要。

你在树莓派上的开发环境中总体上获得了合理的体验吗? - matanster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接