与“make”相比,为什么“cabal build”如此缓慢?

时间:2015-12-10 22:35:36

标签: haskell build cabal

如果我有一个包含多个可执行文件的包,我最初使用cabal build构建。现在我更改了一个只影响一个可执行文件的文件,cabal似乎需要大约一两秒来检查每个可执行文件以查看它是否受到影响。另一方面,make,给定相同数量的可执行文件和源文件,将在几分之一秒内确定需要重新编译的内容。为什么巨大的差异?有没有理由,cabal不能只构建自己的makefile版本并从那里开始?

1 个答案:

答案 0 :(得分:3)

免责声明:我对Haskell或make内部人员不够熟悉,无法提供技术细节,但有些网络搜索确实提供了与我的提案相符的一些见解(试图避免通过提供引用来引出意见) )。另外,我假设你的makefile正在调用ghc,显然会cabal

提案:我认为可能有几个关键原因,但主要原因是make是用C语言编写的,而cabal是用Haskell编写的。这将与来自make的高级依赖性检查相结合(尽管我不确定如何在不查看源代码的情况下证明这一点)。其他支持原因,如网上所见:

  • cabal尝试做的不仅仅是简单编译,例如似乎采取了有关包装的步骤(https://www.haskell.org/cabal/
  • cabal是用haskell编写的,虽然运行时用C语言编写(https://en.wikipedia.org/wiki/Glasgow_Haskell_Compiler
  • 同样,不要过于熟悉make内部,make可能只是有一个更快的依赖性检查机制,从而更好地跟踪这些变化。我指出这一点,因为从OP来看,它似乎与cabal可能对所有依赖项进行全面检查的地方存在显着差异。我怀疑这将是速度差异的主要原因,如果是真的。

无论如何,这些都是开源的,可以从各自的站点下载(haskell.org/cabal/和savannah.gnu.org/projects/make/),允许任何人检查实现的具体细节。

根据传递给正在使用的编译器的开关,很可能会看到很多速度差异。

HTH至少指出了你正确的方向。