Mon projet Haskell passe beaucoup de temps dans Linking dist/build/myapp/myapp ...
et également lors du chargement des bibliothèques partagées lors de l'exécution du code TemplateHaskell
.
Je soupçonne que c'est parce que ld
est lent.
Comment puis-je améliorer les temps de liaison en passant à l'éditeur de liens gold
?
gold
Depuis GHC 7.8 , vous pouvez dire à GHC et cabal (au moment de l'exécution sans avoir à recompiler GHC) de se lier avec GNU gold).
Vous avez besoin dans votre .cabal
fichier:
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
(Notez que vous souhaiterez peut-être transmettre ces indicateurs à stack
/cabal
/Setup.hs
sur la ligne de commande au lieu de les coder en dur dans le fichier .cabal afin de ne pas réduire la portabilité du package.)
Pour moi, c'est 3.5x
plus rapide, réduisant le temps de liaison total d'un projet de 150 secondes à 40 secondes.
lld
Voir https://github.com/nh2/link-with-lld-example pour un exemple complet; pièces clés:
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
Comparaison du temps de liaison pour les temps de liaison exécutables finaux de mon projet:
ld 124 seconds
gold 36 seconds
lld 11 seconds