web-dev-qa-db-fra.com

Comment lier avec le GNU linker gold au lieu de ld dans Haskell

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?

33
nh2

Liez 3 fois plus vite avec 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.


Mise à jour: liez 10 fois plus vite avec 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
44
nh2