2017-04-05 87 views
30

我的Haskell項目在Linking dist/build/myapp/myapp ...中花費了大量時間,並在執行TemplateHaskell代碼時加載共享庫。如何在Haskell中使用GNU黃金鍊接器而不是ld鏈接

我懷疑這是因爲ld很慢。

如何通過切換到gold鏈接器來改善鏈接時間?

+0

除了交換鏈接,你可以使用'-dynamic'標誌。它可以很容易地加速鏈接十倍。 – vshabanov

+0

@vshabanov這是真的嗎?過去,我嘗試過使用動態鏈接,並沒有讓我的整個cabal項目變得更快。但是我可能做了一些錯誤的事情,所以它使用'-dynamic-too',給我靜態和動態庫。有一個最小的示例項目能夠顯示它是否真的讓它更快,這將是非常好的。 – nh2

+0

你應該只使用'-dynamic' GHC選項。 '-dynamic-too'鏈接**靜態(慢速,大型可執行文件)和動態(更小的可執行文件,更快的鏈接時間),所以你不會得到任何加速。 – vshabanov

回答

38

鏈接用3X gold

Since GHC 7.8快,你可以告訴GHC和陰謀(在運行時無需重新編譯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文件硬編碼他們不降低包裝的便攜性。)

對我而言,它的速度更快,將項目的總鏈接時間從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/),對吧? –