在生产环境中进行滚动重启时,将AOT编译作为应用JAR构建过程的一部分可以加快这个速度(构建JAR将会显著变慢——你必须支付编译时间的"惩罚")。
我们以前以源代码的形式构建我们的app uberjars,但在生产中也面临着启动速度慢的问题,所以我们在uberjar构建时切换到AOT编译,这降低了我们在生产环境下最差的app的启动时间,从大约一分钟减少到仅有几秒。
至于CI,为了运行测试,它们必须被加载和编译,因此你实际上无法避免这部分时间。你唯一真正可行的选择是转向增量测试,并且只对已更改的代码或依赖已更改的代码进行测试。对我们来说,这是我们转向Polylith的一个未来承诺,因为它的内置测试运行器可以基于git标签解决这个问题——但只有当你把"所有内容"都放到Polylith中,这个好处才会出现。
Alex提到了关于加快开发加载时间的文档,我在工作中使用这种方法,在我的类路径中有一个本地的classes
文件夹,并定期在我的仓库中的主要"应用"上启动一个手动compile
步骤。这意味着自上次编译以来未更改的任何代码都将直接使用现有的.class
文件,而无需在加载时经过Clojure编译过程——但任何已更改的代码仍需要在加载时进行编译。
当在REPL中工作时,它对初始加载时间有很大影响,但随着时间的推移,由于越来越多的代码被更改,它"漂移"了。然而,在工作中,我们倾向于拥有寿命相当长的REPL,并且在修改代码时会评估所有代码,因此最初的慢速加载问题不是很令人烦恼,我并不总是使用classes
东西。当我提到"寿命相当长的REPL"时,我的意思是可以持续几周,甚至几个月。我的主要工作REPL已经运行了十天了,它之所以"这么短",仅仅是因为我遇到了停电,不得不重新启动我的开发机器。