- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 Haskell 程序,它处理一个文本文件并构建一个 Map
(包含数百万个元素)。整个过程可以持续2-3分钟。我发现调整 -H 和 -A 选项会对运行时间产生很大影响。
有documentation关于 RTS 的这个功能,但这对我来说很难读,因为我不知道 GC 理论中的算法和术语。我正在寻找技术性较低的解释,最好是针对 Haskell/GHC 的。是否有任何关于为这些选项选择合理值的引用?
编辑:这就是代码,它为给定的单词列表构建一个字典树。
buildTrie :: [B.ByteString] -> MyDFA
buildTrie l = fst3 $ foldl' step (emptyDFA, B.empty, 1) $ sort $ map B.reverse l where
step :: (MyDFA , B.ByteString, Int) -> B.ByteString -> (MyDFA , B.ByteString, Int)
step (dfa, lastWord, newIndex) newWord = (insertNewStates, newWord, newIndex + B.length newSuffix) where
(pref, lastSuffix, newSuffix) = splitPrefix lastWord newWord
branchPoint = transStar dfa pref
--new state labels for the newSuffix path
newStates = [newIndex .. newIndex + B.length newSuffix - 1]
--insert newStates
insertNewStates = (foldl' (flip insertTransition) dfa $ zip3 (branchPoint:init newStates) (B.unpack newSuffix) newStates)
最佳答案
一般来说,垃圾收集是空间/时间的权衡。给GC更多的空间,就会花费更少的时间。还有(许多)其他因素在发挥作用,特别是缓存,但空间/时间权衡是最重要的一个。
这种权衡是这样的:程序分配内存直到达到某个限制(由 GC 的自动调整参数决定,或通过 RTS 选项显式决定)。当达到限制时,GC 会跟踪程序当前正在使用的所有数据,并回收不再需要的数据所使用的所有内存。此过程延迟的时间越长,同时无法访问(“死亡”)的数据就越多,因此 GC 会避免跟踪该数据。延迟 GC 的唯一方法是提供更多内存可供分配;因此更多的内存等于更少的 GC,等于更低的 GC 开销。粗略地说,GHC 的 -H 选项允许您设置 GC 使用的内存量的下限,因此可以降低 GC 开销。
GHC 使用分代GC,这是对基本方案的优化,其中堆被分为两代或更多代。对象被分配到“年轻”一代,而存活足够长的对象被提升到“老”一代(在第二代设置中)。年轻代的收集比老一代更频繁,其想法是“大多数对象在年轻时死亡”,因此年轻代收集很便宜(它们不跟踪太多数据),但它们回收大量内存。粗略地说,-A 选项设置年轻代的大小 - 即年轻代被收集之前将分配的内存量。
-A 的默认值为 512k:最好让年轻代小于 L2 缓存大小,如果超过 L2 缓存大小,性能通常会下降。但相反的方向是 GC 空间/时间权衡:使用非常大的年轻代大小可能会通过减少 GC 必须完成的工作量来抵消缓存带来的好处。这种情况并不总是发生,它取决于应用程序的动态,这使得 GC 很难自动调整自身。 -H 选项还会增加年轻代的大小,因此也会对缓存使用产生不利影响。
底线是:尝试一下这些选项,看看什么有效。如果您有足够的空闲内存,您很可能可以通过使用 -A 或 -H 来提高性能,但不一定。
关于performance - GHC 的垃圾收集 RTS 选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3171922/
runghc 和 ghc 有什么区别? 我运行了一个简短的程序,似乎可以用两者编译,除了我用 runghc 得到了以下内容,但不是普通的 ghc: error: Variable not in sco
如果 friend 想要运行我的 Haskell 二进制文件,他是否必须先安装 Haskell,还是可以立即自行运行二进制文件? Mac、Windows 和 Linux 上的答案相同吗? 最佳答案 G
ffunction glMultiDrawElements 需要一个指向指针的指针作为其参数之一。如何从 StorableArray Int a 获取 Ptr(Ptr a) ? 最佳答案 您需要先将索
module Has (r,p,s) where import Prelude ((==),Bool(..),otherwise,(||),Eq) import qualified Data.List
我已经构建了 ghc-HEAD,我想尝试构建所有的 stackage lts 或 nightly 看看它能做多少。 无论我说什么都无法说服 stack 使用我的新 ghc 构建任何东西。我尝试设置如下
我正在使用 Emacs (24.3.1) 在 haskell-mode 中与 ghc-mod 一起使用 Haskell。 现在除了一件烦人的事情外,一切都很好: GHC 信息缓冲区中的每个输出仅包含第
为什么升级到 OSX Mavericks 后我的 GHC 7.6.3 不能工作? 最佳答案 花了很长时间才弄清楚如何同时使用 OSX 10.9 和 GHC 7.6.3,这里有一些技巧可以帮助您重新构建
我有一个带有 cabal 文件的主要 Haskell 可执行程序。在那里,我指定 ghc-options . 这个可执行文件链接到野外的其他库。请问ghc-options忽略这些库的 cabal 文件
我有一个使用 -Wall 编译的库,并且我有一个使用 -Wall -Wno-incomplete-patterns 的测试套件 当我使用 stack ghci --test 启动 ghci 时,ghc
我正在尝试使用以下脚本在 Windows 上安装 GHC(并将 ghc 放在路径中),但是当我尝试运行 ghci --version 时它失败了。我认为脚本有问题。 install: - ps:
我在 $HOME 中安装了 ghc-7.2.2 unknown linux tar.bz2在archlinux上。 在使用 cabal-dev 成功安装多个软件包后,尝试安装例如。我得到的解析数字、文
想法 我正在写 DSL ,编译为 Haskell。 该语言的用户可以定义自己的不可变数据结构和相关函数。关联函数是指属于数据结构的函数。 例如,用户可以编写(在“pythonic”伪代码中): dat
(我的问题是在没有 haskell-platform、ghc、cabal 等的情况下分发二进制文件) 我需要部署一个结构良好的 haskell 应用程序(Yesod 脚手架),但我有磁盘空间限制。 G
我试图将 Cygwin 安装程序指向 http://haskell.org/ghc/cygwin ,但安装程序无法找到 setup.ini.sig。如果可能的话,我该如何编辑我的 .bashrc 以引
我有一个现有的 Haskell 函数,它使用 GHC API 从模块中动态加载已编译的代码。它基于博客文章中的代码 Dynamic Compilation and Loading of Modules
我使用:Ubuntu 上的 GHC 7.6.3(通过 apt-get install haskell-platform) 从当前存储库安装它。 正在尝试安装ghc-mod ,因为我的 ide 插件需要
AFAIK,有两种方法可以在 Haskell 中获取用于调试的调用堆栈: 添加 HasCallStack代码中的约束 使用 ghc -prof -fprof-auto-top 编译代码 我的测试代码:
我想用 64 位 GHC 构建 32 位 DLL。这是最小的例子。 测试.hs {-# LANGUAGE ForeignFunctionInterface #-} module Test where
ghc-gc-tune 0.2.1 可以与 ghc 7.4.1 一起使用吗?看来 ghc-gc-tune 已经有一段时间没有更新了,可能只适用于 ghc 6.x?我找不到任何可靠的信息。 我收到以下错
语言扩展 ExplicitForall 使得使用 forall 绑定(bind)类型变量成为可能但不是必需的。 例如,下面的程序可以编译 {-# LANGUAGE ExplicitForAll #-}
我是一名优秀的程序员,十分优秀!