我正在使用 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/