使用Haskell中的解析器组合库进行解析器分析

3

使用Haskell中的解析器组合库进行解析器分析的标准方法有哪些?

我目前正在使用uu-parsinglib,但我非常想知道如何对其他解析器组合库(如Parsec)进行分析。

目前,我已经编写了我的解析器,但速度很慢,且耗费大量内存(对于600行输入文本,在1GB以上的RAM上,需要约5秒钟来解析,我希望找出如何改进它的方法)。


1
你使用了String和List类型吗?那可能会占用大量内存。 - TallerGhostWalt
通常,“我的程序很慢,即使导入很少也会占用XXX GB的RAM”意味着某个地方存在懒惰的错误。这可能与你的解析器无关,而是与你使用解析结果的方式有关。 - MathematicalOrchid
@MathematicalOrchid:我只是将AST打印到终端上。 - Wojciech Danilo
@TallerGhostWalt:我应该使用什么代替? - Wojciech Danilo
1
@danilo2 你能发一些代码或者一个小的可运行示例吗?不了解更多关于程序,很难猜测出问题所在。考虑到你的输入数据只有几千字节,你的内存数据结构可能应该是相同大小。如果你使用了那么多内存,这意味着你做错了什么。你能否尝试一些较小的输入来找出哪些条件会触发大量的内存和时间使用? - bheklilr
1
你尝试过内置的 GHC 分析器吗? - n. m.
1个回答

2
尝试堆分析:
$ ./prog +RTS -K128M -hc -p 
$ hp2ps -c prog.hp

如果配置文件看起来像一座山,并且大小为兆字节,那么你可能需要先构建一个大型数据结构,然后再减小它(然后可以考虑使用累加器或记忆化技术)。
更详细的信息请参阅:http://book.realworldhaskell.org/read/profiling-and-optimization.html

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接