lein run和java -jar myapp的性能是否相同?

时间:2016-08-21 05:40:04

标签: clojure

我正在学习clojure luminus web框架。在本教程中,我可以在项目目录中使用SceneManager.LoadScene(level.name.toString()); 运行我的应用程序。当然,我可以使用lein run编译项目,并使用lein uberjar运行它。我发现负载测试期间java -jar myapp.jar方法稍快一些。

问题:

  1. java -jar myapp.jar中运行clojure代码时是否已编译?

  2. 为什么比REPL方法更快地运行jar文件? (如果我错了,请纠正我。)

  3. 运行已编译的lein run文件时是否可以打开REPL

3 个答案:

答案 0 :(得分:1)

  1. Clojure代码总是编译 Clojure只有一种执行机制。每次从顶级表单末尾的repl命中输入时,编译器都会运行。什么都没解释。除此之外,记住对这些东西进行基准测试非常困难,需要仔细进行。
  2. 通过REPL调用函数而不是通过REPL实际上没有区别。通过REPL加载命名空间和从jar加载命名空间之间的唯一区别是文件中的最后一个表单被发送回n-repl并且状态消息被发送回n-repl。 将代码放在jar中不会改变编译过程它仍然在加载时编译。如果您明确地对代码进行了AOT,那么启动时间将会缩短,之后运行时速度将相同。再一次,对这些事情进行基准测试很难。除了使所有其他内容相同确保在两种情况下都使用相同的日志记录
  3. 是的,我几乎每个项目都这样做。刚跑:
    (nrepl/start-server :port port :bind "127.0.0.1")
    这要求您使用ssh端口转发来访问套接字,这是一种很好的安全措施。不要把你的nrepl港口挂在那里。

答案 1 :(得分:0)

出现这种情况的原因有很多。最明显的是lein使用的TiredCompilation选项。它改变了JIT行为,因此它可以显着影响基准测试结果。

您可以通过lein禁用更改JVM选项:

:jvm-opts ^:replace []

或者

$ export LEIN_JVM_OPTS=

请参阅lein wiki

答案 2 :(得分:0)

至少有两个主要因素:

JVM参数

JVM参数可能不同,当您使用lein run时,它们可以通过lein配置控制,如果您通过java ...手动运行,则可以直接由您控制。 HotSpot编译器选项,内存和GC配置等参数。您可以使用jstatjinfojconsole等工具来检查有效的JVM设置。

应用程序配置

检查您的lein配置文件以及哪种情况都可以运行。您可以在两个不同的应用程序配置中运行应用程序,例如ring的热代码重新加载,不同的环中间件集(检查项目的env目录中的文件)等。