My Haskell 프로젝트는 Linking dist/build/myapp/myapp ...
에 많은 시간을 보내고 TemplateHaskell
코드를 실행할 때 공유 라이브러리를로드합니다.Haskell에서 ld 대신 GNU 골드 링커로 링크하는 방법
나는 이것이 ld
이 느리기 때문이라고 생각됩니다.
gold
링커로 전환하면 어떻게 링크 시간을 향상시킬 수 있습니까?
My Haskell 프로젝트는 Linking dist/build/myapp/myapp ...
에 많은 시간을 보내고 TemplateHaskell
코드를 실행할 때 공유 라이브러리를로드합니다.Haskell에서 ld 대신 GNU 골드 링커로 링크하는 방법
나는 이것이 ld
이 느리기 때문이라고 생각됩니다.
gold
링커로 전환하면 어떻게 링크 시간을 향상시킬 수 있습니까?
gold
Since GHC 7.8과 함께, 당신은 GNU 골드와 링크 (GHC을 다시 컴파일 할 필요없이 런타임) GHC과 음모를 알 수 있습니다. 당신은 당신의 .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
(당신이하지하기 위해 .cabal 파일에 하드 코딩하는 대신 명령 줄에서 stack
/cabal
/Setup.hs
이러한 플래그를 전달 할 수도 있습니다 패키지의 이식성을 낮추십시오.)
나를 위해 3.5x
이 더 빠르며 프로젝트의 총 링크 시간이 150 초에서 40 초로 단축되었습니다.
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
링커 전환 외에도 당신은'-dynamic' 플래그를 사용할 수 있습니다. 쉽게 10 배로 연결할 수 있습니다. – vshabanov
@vshabanov 사실 이것이 사실입니까? 동적 연결을 사용하기 위해 과거에 시도했지만 내 전체 프로젝트에 대한 작업을 더 빠르게 만들지 못했습니다. 하지만 뭔가 잘못된 일을해서 정적 라이브러리와 동적 라이브러리를 모두 제공하는'-dynamic-too'를 사용했을 수도 있습니다. 정말 더 빨리 만들 수 있는지 보여주는 최소한의 예제 프로젝트를 갖는 것이 좋을 것입니다. – nh2
'-dynamic' GHC 옵션 만 사용해야합니다. '-dynamic-too' **는 ** 정적으로 (느리고 큰 실행 파일)과 동적으로 (더 작은 실행 파일, 더 빠른 링크 타임) 링크하므로, 속도 향상을 얻지 못합니다. – vshabanov