分析使用 Haskell 中的解析器组合库编写的解析器

Posted

技术标签:

【中文标题】分析使用 Haskell 中的解析器组合库编写的解析器【英文标题】:Profiling parsers written using parser combinator libraries in Haskell 【发布时间】:2013-08-19 04:16:42 【问题描述】:

在 Haskell 中分析器组合库中编写的分析器的标准方法是什么?

我目前正在使用uu-parsinglib,但我很想知道分析其他解析器组合器库(如Parsec)的方法。

现在我已经编写了我的解析器,它很慢并且占用大量内存(对于 600 行输入文本,解析超过 1Gb 的内存大约需要 5 秒,我想研究如何改进它)

【问题讨论】:

您使用的是 String 和 List 类型吗?这可能会占用大量内存。 “我的程序很慢,并且在少量导入的情况下占用了 XXX GB 的 RAM”通常意味着某处存在惰性错误。这可能与您的 解析器 无关,而是与您如何使用解析结果有关。 @MathematicalOrchid:我只是简单地将 AST 打印到终端 @danilo2 你能发布任何代码,或者一个小的工作示例吗?在不了解更多信息的情况下,很难猜测程序出了什么问题。考虑到您的输入数据只有几千字节,您的内存数据结构可能应该大致相同。如果你用完了那么多内存,那就意味着你做错了什么。您可以尝试一些较小的输入来找出哪些条件会触发大量内存和时间使用吗? 你试过内置的 GHC profiler 吗? 【参考方案1】:

尝试堆分析:

$ ./prog +RTS -K128M -hc -p 
$ hp2ps -c prog.hp

如果配置文件看起来像一座山并且以兆字节为单位, 可能你先构造一个大数据结构,然后再减少它 (然后可以考虑使用累加器或记忆)。

更多详细信息:http://book.realworldhaskell.org/read/profiling-and-optimization.html

【讨论】:

以上是关于分析使用 Haskell 中的解析器组合库编写的解析器的主要内容,如果未能解决你的问题,请参考以下文章

将 C 库与 Haskell 库静态链接

在 Haskell 中使用 Alex 制作解析骰子卷的词法分析器

在Haskell赋值中为实现语言实现解析器时,无法解析'\'

Haskell 中的二次规划

如何在 Haskell 中连接幻像类型中的元组?

LambdaNet:纯Haskell实现的人工神经网络库