为什么不能并行执行编译文件?

时间:2018-10-25 10:52:17

标签: common-lisp sbcl

我有一个项目,其中包含很多不受ASDF管理的文件,这些文件是手动编译的。这些文件是完全独立的,能够并行编译它们对我来说似乎是一种减少编译时间的方法。我的计划是并行编译这些文件,然后依次加载生成的FASL文件。但是在并行化编译之后,我发现性能几乎为零。然后,我去了SBCL的源,发现compile-file takes a world lock实质上是对编译进行顺序化。

我的问题是,compile-file拥有此锁的原因是什么?虽然并行加载FASL确实可能会导致某些争用情况,但在我看来,Lisp文件的编译应该是独立且可并行化的。

1 个答案:

答案 0 :(得分:4)

可从该语言访问编译器。您可以进行编译时编程,具有编译器宏等。正如图所示,有qbsTargetPlatformFromQtMkspec。您通常不能排除编译时的影响,并且这在任何地方都必须是线程安全的。我猜想,要使这种功能强大起来,需要付出的努力比愿意付出的努力要大得多。

不过,您也许可以启动多个Lisp图像进行并行编译。您只需要在编排依赖关系图时对其进行处理。

更新:我偶然发现了一个对话,似乎暗示着SBCL比我想像的要更接近摆脱锁定:https://sourceforge.net/p/sbcl/mailman/message/36473674/