Optimization 关于减少GHC中GC时间的一般建议
当GHC编译的程序花费大量时间进行垃圾收集时,是否有任何通用规则可以遵循以发现原因?一般认为什么太多了?例如,一般来说,60%的生产率是可以接受的,还是表示代码可能有问题?下面是一个快速且非常不完整的列表:Optimization 关于减少GHC中GC时间的一般建议,optimization,haskell,garbage-collection,ghc,Optimization,Haskell,Garbage Collection,Ghc,当GHC编译的程序花费大量时间进行垃圾收集时,是否有任何通用规则可以遵循以发现原因?一般认为什么太多了?例如,一般来说,60%的生产率是可以接受的,还是表示代码可能有问题?下面是一个快速且非常不完整的列表: 测试和基准测试。哈斯克尔的几个弱点之一是难以预测时间和空间成本。如果你没有测试数据,你什么都没有 使用更好的算法。这听起来太简单了,但优化效率低下的算法就像敲打s**t的金子 从战略上使某些数据更加严格测试和基准测试目标是存储物理上较小的WHNF值,而不是产生该值的thunk,从而在最有效的
更好的垃圾收集有一个相当简单的前提:创建更少的垃圾,更快地收集垃圾,产生更少的内存分配/释放。你能做的任何可能导致这三种效果之一的事情都值得一试测试和基准测试分配更少的资源,您将获得更少的GC。我通常认为25%的GC是可以接受的,高于这个值,我开始寻找减少分配的方法。通常,用“+RTS-H”运行程序会有很大帮助。此外,使用-O2构建。您可以使用非评测构建获得
-hT
概要文件(当然需要-rtsopts
,但不需要-prof
)。这可能会指出问题所在。@JohnL:是的,我使用的是-auto-all
。那我就试试手动方式,谢谢。尽管我怀疑探查器正在禁用Data.Vector模块中的fusion,这导致了大部分差异…@Grzegorz:如果Vector
软件包也安装了-auto-all
,您可能需要使用-auto
重新安装它,或者不安装评测。这肯定会干扰融合。+1用于连接算法优化和处理粪便。给猪涂口红现在老了,呃: