我的Haskell项目在Linking dist/build/myapp/myapp ...
中花费了大量时间,并在执行TemplateHaskell
代码时加载共享库。如何在Haskell中使用GNU黄金链接器而不是ld链接
我怀疑这是因为ld
很慢。
如何通过切换到gold
链接器来改善链接时间?
我的Haskell项目在Linking dist/build/myapp/myapp ...
中花费了大量时间,并在执行TemplateHaskell
代码时加载共享库。如何在Haskell中使用GNU黄金链接器而不是ld链接
我怀疑这是因为ld
很慢。
如何通过切换到gold
链接器来改善链接时间?
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秒。
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
除了交换链接,你可以使用'-dynamic'标志。它可以很容易地加速链接十倍。 – vshabanov
@vshabanov这是真的吗?过去,我尝试过使用动态链接,并没有让我的整个cabal项目变得更快。但是我可能做了一些错误的事情,所以它使用'-dynamic-too',给我静态和动态库。有一个最小的示例项目能够显示它是否真的让它更快,这将是非常好的。 – nh2
你应该只使用'-dynamic' GHC选项。 '-dynamic-too'链接**静态(慢速,大型可执行文件)和动态(更小的可执行文件,更快的链接时间),所以你不会得到任何加速。 – vshabanov