为什么GHC需要很长时间才能链接?

z_a*_*xis 18 haskell

>cabal update
>cabal install cabal-install
.......
[43 of 44] Compiling Distribution.Client.Install ( Distribution/Client/Install.hs, dist/build/cabal/cabal-tmp/Distribution/Client/Install.o )
[44 of 44] Compiling Main             ( Main.hs, dist/build/cabal/cabal-tmp/Main.o )
Linking dist/build/cabal/cabal ..
Run Code Online (Sandbox Code Playgroud)

然后我将等待很长时间才能完成链接.

祝商祺!

Mic*_*man 12

很可能是连接器本身.ld已知binutils 的标准很慢.如果你想加快速度(并且有点生活),请尝试安装Gold链接器.在Ubuntu(我假设Debian),那将是:

sudo apt-get install binutils-gold
Run Code Online (Sandbox Code Playgroud)

我一直在家用系统上使用它已经有一段时间了,还没有问题.

  • 确实`ld`很慢,但它没有用,因为ghc做静态链接并试图链接很多东西,链接器要做很多工作.在我稍微老旧的1GB ram的macbook上,`ld`经常耗尽内存并开始交换. (3认同)
  • @John L:嗯,如果它很慢,因为GHC的连接速度超过了必要的链接速度,那么有两种显而易见的方法可以改善整体结果,但只有一种方法不需要弄乱GHC的内部结构.] (2认同)

nh2*_*nh2 7

这应该是一个评论,但我不能在评论中格式化这样的代码:

我设法使用gold作为GHC使用的链接器/usr/bin/ld.gold: --hash-size=31: unknown option,通过安装binutils-gold(如Michael Snoyman的回答中所建议的)安装标准的ghc-with-gold错误,然后/usr/bin/ld通过以下脚本替换符号链接(使用可执行文件chmod +x):

#!/usr/bin/env python2

import sys
import os
import subprocess


tofilter = [
    "--hash-size",
    "--reduce-memory-overheads",
]

filtered = [ a for a in sys.argv if not any(a.startswith(p) for p in tofilter) ]
filtered[0] = "/usr/bin/ld.gold"

subprocess.check_call(subprocess.list2cmdline(filtered))
Run Code Online (Sandbox Code Playgroud)

请注意,尝试使用ghc -pgml /usr/bin/ld.goldghc -pgml /usr/bin/ld.whateverElse不足以设置链接器,因为参数-pgml需要替换GCC而不是LD.GHC称GCC为电话/usr/bin/ld; 这就是上述脚本的原因.

  • 即将发布的GHC版本(可能是7.8)没有必要:http://hackage.haskell.org/trac/ghc/ticket/6063#comment:19 (3认同)