2017-04-05 10 views
30

My Haskell 프로젝트는 Linking dist/build/myapp/myapp ...에 많은 시간을 보내고 TemplateHaskell 코드를 실행할 때 공유 라이브러리를로드합니다.Haskell에서 ld 대신 GNU 골드 링커로 링크하는 방법

나는 이것이 ld이 느리기 때문이라고 생각됩니다.

gold 링커로 전환하면 어떻게 링크 시간을 향상시킬 수 있습니까?

+0

링커 전환 외에도 당신은'-dynamic' 플래그를 사용할 수 있습니다. 쉽게 10 배로 연결할 수 있습니다. – vshabanov

+0

@vshabanov 사실 이것이 사실입니까? 동적 연결을 사용하기 위해 과거에 시도했지만 내 전체 프로젝트에 대한 작업을 더 빠르게 만들지 못했습니다. 하지만 뭔가 잘못된 일을해서 정적 라이브러리와 동적 라이브러리를 모두 제공하는'-dynamic-too'를 사용했을 수도 있습니다. 정말 더 빨리 만들 수 있는지 보여주는 최소한의 예제 프로젝트를 갖는 것이 좋을 것입니다. – nh2

+0

'-dynamic' GHC 옵션 만 사용해야합니다. '-dynamic-too' **는 ** 정적으로 (느리고 큰 실행 파일)과 동적으로 (더 작은 실행 파일, 더 빠른 링크 타임) 링크하므로, 속도 향상을 얻지 못합니다. – vshabanov

답변

38

링크 3 배 빠른 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 초로 단축되었습니다.


업데이트 : 링크 10 배 빠른 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 
+2

내가 묻는 것을 좋아한다면 프로젝트가 얼마나 큰가요? – jberryman

+2

@jberryman별로 크지 않은 150 개의 Haskell 모듈과 8 개의 실행 파일이 있습니다. 그러나 opencv와 같은 몇 가지 기본 라이브러리에 의존합니다 (링크). 'ld'을 사용하면 각 라이브러리 링크가 거의 20 초 걸립니다. – nh2

+0

나는 이것이 [lld] (https://lld.llvm.org/)에서도 유효하다고 생각 하나? –