我的Haskell項目在Linking dist/build/myapp/myapp ...
中花費了大量時間,並在執行TemplateHaskell
代碼時加載共享庫。如何在Haskell中使用GNU黃金鍊接器而不是ld鏈接
我懷疑這是因爲ld
很慢。
如何通過切換到gold
鏈接器來改善鏈接時間?
我的Haskell項目在Linking dist/build/myapp/myapp ...
中花費了大量時間,並在執行TemplateHaskell
代碼時加載共享庫。如何在Haskell中使用GNU黃金鍊接器而不是ld鏈接
我懷疑這是因爲ld
很慢。
如何通過切換到gold
鏈接器來改善鏈接時間?
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秒。
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'標誌。它可以很容易地加速鏈接十倍。 – vshabanov
@vshabanov這是真的嗎?過去,我嘗試過使用動態鏈接,並沒有讓我的整個cabal項目變得更快。但是我可能做了一些錯誤的事情,所以它使用'-dynamic-too',給我靜態和動態庫。有一個最小的示例項目能夠顯示它是否真的讓它更快,這將是非常好的。 – nh2
你應該只使用'-dynamic' GHC選項。 '-dynamic-too'鏈接**靜態(慢速,大型可執行文件)和動態(更小的可執行文件,更快的鏈接時間),所以你不會得到任何加速。 – vshabanov