performance - 启用某些规​​则时,UU-Parsinglib 会急剧变慢

标签 performance parsing haskell parsec uu-parsinglib

我正在使用 uu-parsinglib 编写编译器我看到了一件非常奇怪的事情。我定义了一个 pChoice组合器如:

pChoice    = foldr (<<|>) pFail

(注意,我正在使用贪婪的 <<|> )。

让我们考虑以下代码:

pFactor i = pChoice [ Expr.Var    <$> pVar
                    , Expr.Lit    <$> pLit True
                    , L.pParensed (pExpr i)
                    -- , Expr.Tuple  <$> pTuple (pOpE i)
                    -- , Expr.List   <$> pLst   (pListE i)
                    ]

每个元素以不同的字符开头 - Expr.Var以字母开头,Expr.Lit有一个数字,L.pParensed带括号 ( , Expr.Tuple带支架 {Expr.List带支架 [ .

我有一个很大的测试代码,其中没有元组也没有列表。代码在 0.15s 中解析.当我取消注释以上几行时,时间增加到 0.65s .这是超过 400% 的减速……这怎么可能?我只使用贪婪运算符,我确定解析器没有在 Tuple 中使用也不List部分,因为在整个代码中没有元组和列表。

如果您需要更多代码或定义,我当然会发布。

最佳答案

我认为问题的原因可能在于您对 pFactor 进行了参数化。这将导致每次调用这样的解析器来构建一个新的解析器,这需要时间。一劳永逸地创建这样的解析器并在实际解析过程中共享它们要好得多。我看不到你是如何使用这个解析器的,我无法进一步回答你的问题。

关于performance - 启用某些规​​则时,UU-Parsinglib 会急剧变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20852392/

相关文章:

java - 数组/vector 作为方法参数

performance - JMeter - 在另一个变量中使用一个变量

android: 错误解析包

haskell - 为什么某些类型类以 "Monad"为前缀?

javascript - 提取 Javascript 数字的指数和尾数

haskell - "you do computations in Haskell by declaring what something is instead of declaring how you get it"是什么意思?

c++ - 并行程序与线性程序相比没有速度增加

c++ - 16 到 32 位整数转换与性能

html - 使用 sed 删除 html 表格列

parsing - 解析、突出显示和补全之间的关系