我的Haskell项目在执行 TemplateHaskell
代码时,花费了大量时间在 Linking dist/build/myapp/myapp ...
和加载共享库上。
我怀疑这是因为 ld
太慢了。
如何通过切换到 gold
链接器来提高链接时间呢?
我的Haskell项目在执行 TemplateHaskell
代码时,花费了大量时间在 Linking dist/build/myapp/myapp ...
和加载共享库上。
我怀疑这是因为 ld
太慢了。
如何通过切换到 gold
链接器来提高链接时间呢?
gold
,让链接速度提升3倍自GHC 7.8以来,你可以在运行时告诉GHC和cabal(无需重新编译GHC),使用GNU gold进行链接。
你需要在.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.5倍
,将一个项目的总链接时间从150秒缩短到了40秒。
lld
可以使链接速度提升10倍请参阅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
ld
命令进行每个库链接几乎需要20秒。 - nh2lld
不接受 ld
所有的标志,而且官方上 gcc
(GHC 默认用于链接的程序)不支持使用 lld
进行链接。 (还有你应该是指 lld
而不是 ldd
-- 只是提醒因为这个打字错误实际上可能会让人感到困惑,因为两者都是与链接相关的程序)。 - nh2
与静态链接相比,动态链接的运行时性能成本相当高
。请注意,我在lld
中有数百个条目。关于加速,链接时间似乎已经从每个可执行文件2.5秒降至1.5秒,但对我来说,这并不值得增加启动时间。 - nh2-fvisibility=hidden
并手动导出所有导出符号,可以大大提高动态链接速度。也许使用它可以改善动态加载启动时间。 - nh2