首页 文章

Clojure应用程序启动性能

提问于
浏览
19

我在Clojure中编写了一些小的实用程序应用程序,我使用Maven和maven-shade-plugin编译成自包含的可执行JAR文件(“uberjars”) . 这些uberjars包含应用程序所依赖的clojure.jar和其他库(即:commons-cli)的解压缩版本 . 它们很方便,因为我可以将它们发送给客户而无需客户安装Clojure(所有客户都已经安装了JRE) .

我发现Clojure应用程序需要几秒钟才能启动,而用Java编写的类似应用程序在相同的机器上以秒为单位启动(例如,显示使用消息的时间) .

我怀疑这是因为Clojure正在编译clojure.core库中的一些代码,因为clojure.jar文件中有源代码( .clj 文件) .

有没有办法预编译这个源代码?可以采取其他措施来加速启动性能吗?我听到客户抱怨启动需要多长时间(他们不知道或不关心应用程序是用Clojure,Java还是Foobar编写的) .

3 回答

  • 1

    JVM(至少Oracle 's HotSpot) makes very tricky thing to reduce startup time. It doesn' t加载到内存所有程序的类和方法,它加载 only resources it needs right now . 显示用法消息或类似的东西所需的代码不多,所以实际只加载了很少的函数,Java程序快速启动而且,HotSpot doesn't even compile 这几个函数 - 它使用JIT编译(和其他优化)代码,这是重复执行的 . 有's no reason to spend time to compile functions that will be executed only once, e.g. almost all startup methods, and HotSpot doesn' t .

    那么,Clojure呢?我没有添加类似功能的核心 . 不过,您可以在Clojure代码中使用相同的方法 . 您说您的实用程序使用了几个库,这可能会减慢启动速度 . 那么, load libraries lazily 尽可能多 . 例如,您可以从命名空间定义中排除 :use 选项,而在主体函数中调用显式 use . 这不会减少总时间,但是当它不那么明显时,它将会到来 . 您甚至可以用Java编写程序的一小部分,并仅在实际需要时调用Clojure代码 .

  • 3

    在Clojure网站上有一个很好的描述AOT compilation . 这已经减少了一些启动时间 .

    Edit :在持久性JVM上运行Clojure程序已经做了一些努力,从而减少了启动时间 . 查找jark jvm . 然而该网站似乎已经消失:(

  • 4

    当然,还有用于提高JVM启动性能的java -client JVM参数 . 这个SO question详细介绍了这个主题 .

相关问题