如何 link 使用 GNU gold linker 而不是 Haskell 中的 ld
How to link with the GNU gold linker instead of ld in Haskell
我的 Haskell 项目在 Linking dist/build/myapp/myapp ...
以及执行 TemplateHaskell
代码时加载共享库上花费了大量时间。
我怀疑这是因为 ld
很慢。
如何通过切换到 gold
linker 提高 link 倍?
Link 使用 gold
快 3 倍
Since GHC 7.8,您可以使用 GNU gold 告诉 GHC 和 cabal(在 运行 时无需重新编译 GHC)到 link。
您需要在 .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
更快,将项目的总 link 时间从 150 秒减少到 40 秒。
更新:Link 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
最终可执行文件 link 时间与我的项目的 link 时间比较:
ld 124 seconds
gold 36 seconds
lld 11 seconds
我的 Haskell 项目在 Linking dist/build/myapp/myapp ...
以及执行 TemplateHaskell
代码时加载共享库上花费了大量时间。
我怀疑这是因为 ld
很慢。
如何通过切换到 gold
linker 提高 link 倍?
Link 使用 gold
快 3 倍
Since GHC 7.8,您可以使用 GNU gold 告诉 GHC 和 cabal(在 运行 时无需重新编译 GHC)到 link。
您需要在 .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
更快,将项目的总 link 时间从 150 秒减少到 40 秒。
更新:Link 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
最终可执行文件 link 时间与我的项目的 link 时间比较:
ld 124 seconds
gold 36 seconds
lld 11 seconds