Ral*_*lph 19 performance clojure startup
我在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编写的).
JVM(至少是 Oracle 的 HotSpot)在减少启动时间方面做了非常棘手的事情。它不会将所有程序的类和方法加载到内存中,而是仅加载当前需要的资源。不需要太多代码来显示使用消息或类似内容,因此实际上只加载了很少的函数,并且 Java 程序可以快速启动。此外,HotSpot甚至不编译这几个函数 - 它使用 JIT 编译(和其他优化)来重复执行代码。没有理由花时间编译只执行一次的函数,例如几乎所有的启动方法,而 HotSpot 则不会。
那么,Clojure 呢?我认为您不想重写 Clojure 的核心来添加类似的功能。不过,您可以在 Clojure 代码中使用相同的方法。您说您的实用程序使用多个库,这可能会减慢启动速度。因此,请尽可能延迟加载库。例如,您可以:use从命名空间定义中排除 option 并use在主体函数中调用显式调用。这不会减少总时间,但会将延迟转移到不那么明显的时刻。您甚至可以用 Java 编写程序的一小部分,并仅在实际需要时调用 Clojure 代码。
| 归档时间: |
|
| 查看次数: |
2370 次 |
| 最近记录: |