2017-04-05 48 views
30

我的Haskell项目在Linking dist/build/myapp/myapp ...中花费了大量时间,并在执行TemplateHaskell代码时加载共享库。如何在Haskell中使用GNU黄金链接器而不是ld链接

我怀疑这是因为ld很慢。

如何通过切换到gold链接器来改善链接时间?

+0

除了交换链接,你可以使用'-dynamic'标志。它可以很容易地加速链接十倍。 – vshabanov

+0

@vshabanov这是真的吗?过去,我尝试过使用动态链接,并没有让我的整个cabal项目变得更快。但是我可能做了一些错误的事情,所以它使用'-dynamic-too',给我静态和动态库。有一个最小的示例项目能够显示它是否真的让它更快,这将是非常好的。 – nh2

+0

你应该只使用'-dynamic' GHC选项。 '-dynamic-too'链接**静态(慢速,大型可执行文件)和动态(更小的可执行文件,更快的链接时间),所以你不会得到任何加速。 – vshabanov

回答

38

链接用3X gold

Since GHC 7.8快,你可以告诉GHC和阴谋(在运行时无需重新编译GHC)与GNU金链接。

你需要在你.cabal文件:

library: 
    ghc-options: -optl-fuse-ld=gold 
    ld-options: -fuse-ld=gold 

executable myExecutable 
    ghc-options: -optl-fuse-ld=gold 
    ld-options: -fuse-ld=gold 

(请注意,你可能要为了这些标志传递给stack/cabal/Setup.hs在命令行上,而不是在.cabal文件硬编码他们不降低包装的便携性。)

对我而言,它的速度更快,将项目的总链接时间从150秒缩短到40秒。


更新:连接速度快10倍与lld

https://github.com/nh2/link-with-lld-example一个完整的例子。关键部分:链路时间最终可执行链接次我的项目

library 
    ghc-options: "-pgmP clang" "-pgmc clang" "-pgma clang" "-pgml clang" "-optl-fuse-ld=lld" 
    ld-options: -fuse-ld=lld 

executable myExecutable 
    ghc-options: "-pgmP clang" "-pgmc clang" "-pgma clang" "-pgml clang" 
    ld-options: -fuse-ld=lld 

比较:

ld 124 seconds 
gold 36 seconds 
lld 11 seconds 
+2

如果你不介意我问,你的项目有多大? – jberryman

+2

@jberryman不是很大,有150个Haskell模块和8个可执行文件。但它依赖于(和链接)一些像opencv这样的本地库。使用'ld',每个库链接花费将近20秒。 – nh2

+0

我怀疑这也适用于[lld](https://lld.llvm.org/),对吧? –