我正在接收和处理JSON请求的Haskell守护进程。 虽然守护进程的操作是复杂的,但主要的结构是故意保持简单:其内部状态只是一个具有数据结构的IORef ,所有线程都在这个IORef上执行primefaces操作。 然后有一些线程在触发器上取值a做一些事情。 问题是守护进程正在泄漏内存,我找不到原因。 这当然与请求有关:当守护进程每秒获得几个请求时,它会泄漏1MB / s的东西(如Linux工具所报告的)。 内存消耗稳步增加。 没有请求,内存消耗保持不变。 令我感到困惑的是,这些都没有显示在GHC分析中。 要么我在configuration文件参数中丢失了某些内容,或者内存被别的东西占用了: 用+RTS -hc -xt -p运行+RTS -hc -xt -p : 运行+RTS -hr -xt -p : 在此testing运行期间,守护进程随后消耗超过1GB。 所以分析数据显然不符合实际消耗的内存数量级。 (据我所知,RTS,GC和configuration本身增加了实际的内存消耗,但是这种差别太大了,并不符合不断增长的消耗。) 我已经尝试过处理rnf中守护进程的所有状态数据,以及parsing的JSON请求(以避免部分JSONstring被保留在某处),但是没有太多成功。 任何意见或build议表示欢迎。 更新:守护进程在没有-threaded情况下运行,所以没有OS级的线程。 GC统计信息比堆分析更接近Linux报告的数字: Alloc Copied Live GC GC TOT TOT Page Flts bytes bytes bytes user elap user elap […] 5476616 44504 2505736 0.00 0.00 23.21 […]
我有一个Haskell程序处理一个文本文件,并build立一个Map (数百万元)。 整个事情可以运行2-3分钟。 我发现调整-H和-A选项对运行时间有很大的影响。 有关于RTS的这个function的文档 ,但是对于我来说这是一个很难读懂的东西,因为我不知道GC理论中的algorithm和术语。 我正在寻找一个较less的技术解释,最好是特定于Haskell / GHC。 有没有关于select这些选项的明智价值的参考? 编辑:这是代码,它build立一个给定的单词列表trie。 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 […]
我想用{-# LANGUAGE OverloadedStrings #-}但我忘了它是如何调用的。 这种事情不是好事,也需要一些时间来find使用谷歌*。 GHC扩展名列表中是否存在LANGUAGE编译指示? *我使用Googlesearch的search行程: 谷歌 哈斯克尔在维基百科 GHC在维基百科 GHC语言function 重载string文字 OverloadedStrings
有没有什么好的方法来制作小型的haskell可执行文件? 用ghc6,一个简单的hello世界程序似乎达到了370kB(523kB之前)。 C中的Hello world约为4kB(带前9kB)。
我正在按照惯例“ 睡觉前阅读LYAH的一章”,感觉就像我的大脑随着每个代码样本的扩展一样。 在这一点上,我确信我理解了Haskell的核心优势,现在只需要了解标准库和types类,就可以开始编写真正的软件。 所以我正在阅读关于应用函数的章节,突然之间,书中宣称函数不仅仅是types, 而是types,并且可以被视为types类(例如,通过使它们成为types类的实例)。 ( – >)是一个types构造器像任何其他。 我的思绪再次被吹起,我立即跳下床,启动计算机,去了GHCi,发现了以下情况: Prelude> :k (->) (->) :: ?? -> ? -> * 这到底是什么意思? 如果( – >)是一个types构造函数,那么值构造函数是什么? 我可以猜测,但不知道如何定义传统data (->) … = … | … | … data (->) … = … | … | … data (->) … = … | … | …格式。 用任何其他types的构造函数都可以做到这一点很简单: data Either ab = […]
Simon在幻灯片30/78上build议,types类的实现一开始就是“绝望”。 有人知道这是为什么吗?
我想在Haskell项目中使用外部库RDFox 。 上下文:我正在使用GHC 7.10和堆栈 ,都是64位的Windows和Linux。 RDFox是用C ++编程的。 RDFox共享库(.dll,.so)可以用Java和Python包装下载。 目标:我想在我的Haskell项目中重用RDFox(.dll,.so)编译的库,所以我需要为RDFox创build一个Haskell包装器。 问题:对于Haskell来说相对较新,我很难知道从哪里开始。 我find了关于这个主题的几个页面(来自Haskell wiki和StackOverflow),但是工作stream和configuration对我来说并不清楚。 问题:我想知道: 如何configuration堆栈和cabal使用外部库,build立在Windows 或 Linux(不同的机器,相同的存储库)。 如何在此外部库上configurationGHCi进行交互式testing。 Python包装器翻译成Haskell是最好的方法吗? 我想避免对RDFox C ++代码的分析。
该文件指出: 函数f上的{ – #INLINABLE f# – } pragma具有以下行为: 虽然INLINE说“请把我列入”,但是INLINABLE说:“随意联系我,使用你的自由裁量权”。 换句话说,select留给GHC,它使用与无杂注函数相同的规则。 与INLINE不同,该决定是在呼叫站点进行的,因此将受到内联阈值,优化级别等的影响。 像INLINE一样,INLINABLE pragma保留了原始RHS的内联目的,并将其保存在接口文件中,而不pipeRHS的大小如何。 使用INLINABLE的一种方法是与内联的特殊function(第7.18节“特殊内置function”)结合使用。 内联调用f很难内联f。 为了确保f可以内联,将f的定义标记为INLINABLE是一个好主意,这样GHC就可以保证揭示一个展开,而不pipe它有多大。 此外,通过将f注释为INLINABLE,可以确保f的原始RHS是内联的,而不是任何随机优化的GHC优化器生成的版本。 INLINABLE pragma也适用于SPECIALIZE:如果将函数f标记为INLINABLE,那么随后可以在另一个模块中进行SPECIALIZE(请参见第7.16.8节“SPECIALIZE pragma”)。 与INLINE不同的是,在recursion函数中使用INLINABLE编译指示是可以的。 这样做的主要原因是为了让以后使用SPECIALIZE 它有什么缺点? 它是否使界面文件更大,更大? 它会使编译速度变慢吗? 有什么理由不应该在我写的每个导出的函数上放置一个INLINABLE编译指示? 有没有什么原因GHC不会在我写的每个导出的函数上放置一个INLINABLE编译指示?
我试图从Haskell源代码创build一个共享库。 我试过按照这里的说明: http : //weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/但我只是没有任何运气。 当我用Haskell 64位(从2011.4.0.0 ghc 7.0.4)编译我得到以下错误: ld: pointer in read-only segment not allowed in slidable image, used in ___gmpn_modexact_1c_odd 作为替代scheme,我也尝试了32位版本,并根据确切的标志,我用链接获取错误,如: Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib 我确实设法通过在链接器行中添加-lHSrts来进一步实现。 这让我到成功链接和加载库的点,但我无法find函数名称使用dlsym(或手动使用nm | grep) 任何提示将不胜感激,一个例子make文件,或构build线已经成功地build立(和使用)在OS X共享库将不胜感激。 对于Haskell来说,我是个新手,不知道是否应该继续敲我的脑袋,假设问题出在我身上,或者出于各种原因,我不希望这个问题能够在OS X上运行。 我已经尝试过的所有组合的git回购可在这里: https : //github.com/bennoleslie/haskell-shared-example我做了一些工作的32位ghc,但不是64位呢。
在整个networking中,我感觉到为编译器编写C后端不再是一个好主意。 GHC的C后端没有被积极开发(这是我没有支持的感觉)。 编译器的目标是C–或LLVM。 通常情况下,我认为GCC是一个很好的老成熟的编译器,在优化代码方面performance良好,因此编译为C将使用GCC的成熟度来产生更好更快的代码。 这是不是真的? 我意识到这个问题在很大程度上取决于正在编译的语言的性质和其他因素,以便获得更多可维护的代码。 我正在寻找一个比较一般的答案(关于编译语言),它只关注性能(不考虑代码质量,等等)。 如果答案中包含一个关于GHC为什么偏离C的解释,以及为什么LLVM能够更好地作为后端( 参见这个 )或者其他编译器的例子,我也不太了解。