Подтвердить что ты не робот

Как связываться с золотым компоновщиком GNU вместо ld в Haskell

Мой проект Haskell проводит много времени в Linking dist/build/myapp/myapp ..., а также при загрузке разделяемых библиотек при выполнении кода TemplateHaskell.

Я подозреваю, что это потому, что ld работает медленно.

Как улучшить время соединения, переключившись на компоновщик gold?

4b9b3361

Ответ 1

Ссылка 3 раза быстрее с gold

Начиная с GHC 7.8, вы можете указать GHC и cabal (во время выполнения без необходимости перекомпилировать GHC) для связи с золотом GNU.

Вам нужен файл .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 секунд.


Обновление: Link 10x быстрее с lld

См. 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