My Haskell project spends lots of time in Linking dist/build/myapp/myapp ...
and also in loading shared libraries when executing TemplateHaskell
code.
I suspect this is because ld
is slow.
How can I improve link times by switching to the gold
linker?
gold
Since GHC 7.8, you can tell GHC and cabal (at run time without having to recompile GHC) to link with GNU gold.
You need in your .cabal
file:
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
(Note you might want to pass these flags to stack
/cabal
/Setup.hs
on the command line instead of hardcoding them in the .cabal file in order to not reduce the portability of the package.)
For me it's 3.5x
faster, bringing down the total link time of a project from 150 seconds to 40 seconds.
lld
See https://github.com/nh2/link-with-lld-example for a full example; key parts:
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
Comparison of link time for the final executable link times my project:
ld 124 seconds
gold 36 seconds
lld 11 seconds