我正在使用 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
我正在使用 lein repl
在控制台执行Clojure REPL。运行时需要超过15秒。当我运行java -cp clojure-1.6.0.jar clojure.main
时,只需要几秒钟。
为什么lein repl
如此缓慢?是否有方法使其更快?
我的环境:
Leiningen启动两个JVM,并将它们连接在一起。为此,它必须加载额外的东西。你输入的提示符是与Clojure进程不同的进程,该进程评估你的代码。此外,Leiningen还必须解析您的项目文件,并确保一切都按其要求设置,或者如果您的maven配置目录中有任何缺失,则从Web获取所需内容。在Leiningen示例项目文件中,如果您仔细阅读,可以找到一些选项,这些选项可以稍微加快速度。我认为目前Leiningen的启动慢只是生活的事实之一。
更多相关信息:
java -cp ~/.m2/repository/org/clojure/clojure/1.7.0/clojure-1.7.0.jar clojure.main
会有问题。这对于cider来说并不能解决问题,但对于小型实验而言可以工作,不是吗?也许我甚至可以使用drip来使它更快? - iLemminglein repl
,它将加载您项目的源代码文件,并启动一个repl。即使对于一个小项目,如果您的源代码文件引用外部依赖项,这也会增加相当多的时间。但是java -cp clojure-1.6.0.jar clojure.main
不会加载任何项目源代码文件或依赖项。lein uberjar; java -cp target/*standalone.jar clojure.main
- Aaron Blenkush你的第一个问题已经得到了回答,所以关于第二个问题,我猜你想要减少启动时间,因为你通常会加载一些在编码过程中正在更改的命名空间。可以使用(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服务器和客户端,这可能会缩短启动时间。
java -cp clojure-1.6.0.jar clojure.main
运行 repl 时,它启动得相对较快。因此这不是由于 JVM 启动时间引起的。 - ntalbs