2024 Clojure状态调查!中分享您的想法。

欢迎!请在关于页面查看更多有关如何使用本站的信息。

+1
Clojure

2018年,Alex Miller在ClojureVerse上提到,为Clojure实现一个类编译缓存,可能有助于加速库的加载。

Rich和我一直在讨论一些关于类编译缓存的想法,这些想法将被集成到核心中,并将在Clojure 1.10中进行研究,但我们并没有十足的把握。潜在地说,它可能会结合只发布源代码和AOT的性能优势。当库的源代码未发生变化时,重复编译相同的库源代码文件本质上是有趣的。

这个想法还在研究中吗?如果可行的话,它似乎可以带来非常可观的加速。

1 个回答

+1

我已经在这个想法上做了一些尝试,包括编译器和命令行界面,简而言之,这很棘手。虽然这个想法还在探讨中,但我们在上一次查看它时得出结论,已经有工具可以针对每个应用程序创建这样的缓存(这样就可以避免很多复杂性),并编写了这篇指南,说明了如何做到这一点

https://clojure.org/guides/dev_startup_time

现在可能需要重新编写这篇指南,以考虑工具.build,但基本思路是一样的。

我的经验是,按照指南中描述的手动AOT编译,即使是非常有经验的开发者也会遇到问题。一旦你意识到这是一个AOT问题,解决方案就很简单:重新编译。我本来希望有一种方法可以自动化解决这些棘手的情况,但我明白这很困难。
指南中描述的编译是在运行时发生的相同编译,我认为人们对它的使用有很多无根据的恐惧。人们对AOT有时看到的问题可以分为几类——一类是当你有编译和未编译的代码层,协议正在被重新编译时。按照指南方法,这种情况不会发生,因为一切都是按照加载顺序编译的,就像它在运行时那样。另一类是在REPL中更改具有运行时效果的编译内容——那里有一些我们在1.12版本中希望着手解决的问题。许多人已经使用了指南中的方法,并发现它显著提高了启动时间,不像你想象的那么容易出问题(特别是因为它遵循了你的应用加载顺序)。试用并在此处报告问题!
...