【发布时间】:2011-06-05 08:11:56
【问题描述】:
这是我实现的一种陷阱(隐式键和一些存储在节点中的附加信息):http://hpaste.org/42839/treap_with_implicit_keys
根据分析数据,GC 花费了该程序 80% 的时间。据我了解,这是由于每次“修改”节点时,都会重新创建根路径上的每个节点。
我可以在这里做些什么来提高性能还是我必须进入 ST monad 的领域?
【问题讨论】:
-
@adamax:这种行为(重新创建直到根的所有内容)在不可变结构中很常见,你读过 Chris Okasaki 的 Purely Functional Data Structures 吗? cs.cmu.edu/~rwh/theses/okasaki.pdf他为此写了几篇论文。
-
也许你应该通过使用
+RTS -s -RTS运行你的程序来验证这一点,因为当我使用 7.0.1 快速运行它时,我看不到你所说的这 80%,我看到大约 16%在 GC 中花费的时间。 -
@ScottWest:我用 ghc -O2 -prof --make test.hs 编译它并用 ./test +RTS -s -RTS 运行,它说 %GC time 77.4% (77.4% elapsed ),总时间为 8.7 秒。但我的 ghc 版本是 6.12.1。只是出于兴趣,您系统的总时间是多少?
-
@adamax,我的结果和你差不多。使用 ghc-7.0.1 和 -O2,运行时间为 8.027 秒,生产率为 16.8%。如果我使用 -O2 -funfolding-use-threshold=256 编译,运行时间为 3.863 秒,生产率为 24.9%。我尝试了一些其他选项和内联的东西,但这是我迄今为止最好的。
-
别忘了 GHC 的垃圾回收选项:stackoverflow.com/questions/3171922/…
标签: performance optimization data-structures haskell garbage-collection