leiningen为什么开始这么慢?

时间:2014-07-31 06:32:46

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

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

为什么lein repl这么慢?反正有没有让它更快?

我的环境:

  • H / W:MacBookAir
  • O / S:Mac OS 10.9 Mavericks
  • CPU:i7
  • MEM:8GB

5 个答案:

答案 0 :(得分:10)

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

更多相关信息:

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

Faster

答案 1 :(得分:4)

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

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

答案 2 :(得分:4)

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

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

答案 3 :(得分: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服务器和客户端

答案 4 :(得分:1)

在我的例子中,cider-nrepl插件显着地增加了加载时间。

使用jvisualvm进行的快速非科学研究表明,大量时间用于加载&评估文件(0.10-snapshot不是AOT-ed),还有扫描类路径的init逻辑。

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

在我看来,jvm没有比操作系统或文件系统更重要的作用。这完全是关于正在加载的代码。