【发布时间】:2017-08-31 18:49:10
【问题描述】:
我的 Haskell 项目在Linking dist/build/myapp/myapp ... 上花费了大量时间,并且在执行TemplateHaskell 代码时还用于加载共享库。
我怀疑这是因为ld 很慢。
如何通过切换到gold 链接器来缩短链接时间?
【问题讨论】:
-
除了切换链接器,您还可以使用
-dynamic标志。它可以轻松地将链接速度提高十倍。 -
@vshabanov 真的是这样吗?我过去曾尝试使用动态链接,但它并没有让我的整个 cabal 项目变得更快。但我可能做错了什么,所以它使用了
-dynamic-too,给了我静态库和动态库。如果有一个最小的示例项目来展示它是否真的让它更快,那就太好了。 -
您应该只使用
-dynamicGHC 选项。-dynamic-too同时链接静态(缓慢、大的可执行文件)和动态(较小的可执行文件,更快的链接时间),因此您不会获得任何加速。 -
@vshabanov 在 Linux 上。我有大约 30 GB 的可用 RAM。这不是缓存问题,它会在后续启动时发生;花费的时间是 ld-linux 动态链接器/加载器中花费的 100% 用户 CPU 时间。 This page 同意这种现象:
The runtime performance costs of dynamic linking are substantial compared to those of static linking。请注意,我在lld中有 100 个条目。关于加速,链接时间似乎从每个可执行文件的 2.5 秒下降到 1.5 秒,但这对我来说不值得增加启动时间。 -
我发现this useful comment 表明通过设置
-fvisibility=hidden并手动导出所有导出的符号可以显着提高动态链接速度。也许可以通过使用它来改善动态加载启动时间。
标签: haskell linker gold-linker