我的Haskell项目在执行TemplateHaskell
代码时花费了大量时间在Linking dist/build/myapp/myapp ...
和加载共享库上。
我怀疑这是因为ld
很慢。
如何通过切换到gold
链接器来缩短链接时间?
使用 gold
链接速度提高 3 倍
从 GHC 7.8 开始,你可以告诉 GHC 和 cabal(在运行时不必重新编译 GHC(与 GNU Gold 链接。
您需要在.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 文件中硬编码它们,以免降低包的可移植性。
对我来说,它3.5x
快,将项目的总链接时间从 150 秒减少到 40 秒。
更新:使用 lld
链接速度提高 10 倍
有关完整示例,请参见 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