使用 antlr 的 Xpath 语法文件中的性能问题
Performance issue in Xpath grammar file using antlr
我在为 Xpath 创建语法时 运行 遇到性能问题。
在我们添加对 xpath 的支持之前,整个语法工作正常:
((div)[1]//span)[1]
或
((//div)[1]/div)[last()]
在语法文件中添加对此的支持后,上述 xpaths 开始正常工作,但其他 xpaths 开始出现性能问题。
喜欢这个:
//label[normalize-space(.)='Phone']/parent::lightning-input/parent::slot/parent::slot/parent::span/parent::div/parent::force-record-layout-item/parent::slot/parent::force-record-layout-row/parent::slot/parent::div/parent::div/parent::div/parent::force-record-layout-section/parent::slot/parent::force-record-layout-block/parent::forcegenerated-detailpanel_contact___012b0000000jhhvia4___full___view___recordlayout2/parent::records-lwc-record-layout/parent::slot/parent::records-record-layout-event-broker/parent::div/parent::div/following-sibling::force-form-footer//button
开始解析需要 30 秒(之前需要 170 毫秒)。
附加语法文件中的代码行 added/modified 开始出现性能问题:
union
: expressions+=pathExpression (WS? operator='|' WS? expressions+=pathExpression)*
;
pathExpression
: expressionAtom
| expressionAtom nodeSet
;
expressionAtom
: functionCall
| nodeSet
| literal
| parenthesis
;
早些时候是:
union
: expressions+=expressionAtom (WS? operator='|' WS? expressions+=expressionAtom)*
;
expressionAtom
: functionCall
| nodeSet
| literal
| parenthesis
;
过去没有出现性能问题。
在调试 XpathParser 时我发现这是因为 DFAState 有** requiresFullContext
作为 true
** 在这种情况下。
文档指出此的真实值“表明此状态是在 SLL 预测期间创建的,该预测发现状态中的配置之间存在冲突。”
你能帮我解决这个问题吗?是什么导致它搜索完整的上下文需要时间?
我不太了解Antlr,但是替换一下怎么样
pathExpression
: expressionAtom
| expressionAtom nodeSet
;
和
pathExpression
: expressionAtom nodeSet?
;
我在为 Xpath 创建语法时 运行 遇到性能问题。
在我们添加对 xpath 的支持之前,整个语法工作正常:
((div)[1]//span)[1]
或
((//div)[1]/div)[last()]
在语法文件中添加对此的支持后,上述 xpaths 开始正常工作,但其他 xpaths 开始出现性能问题。
喜欢这个:
//label[normalize-space(.)='Phone']/parent::lightning-input/parent::slot/parent::slot/parent::span/parent::div/parent::force-record-layout-item/parent::slot/parent::force-record-layout-row/parent::slot/parent::div/parent::div/parent::div/parent::force-record-layout-section/parent::slot/parent::force-record-layout-block/parent::forcegenerated-detailpanel_contact___012b0000000jhhvia4___full___view___recordlayout2/parent::records-lwc-record-layout/parent::slot/parent::records-record-layout-event-broker/parent::div/parent::div/following-sibling::force-form-footer//button
开始解析需要 30 秒(之前需要 170 毫秒)。
附加语法文件中的代码行 added/modified 开始出现性能问题:
union
: expressions+=pathExpression (WS? operator='|' WS? expressions+=pathExpression)*
;
pathExpression
: expressionAtom
| expressionAtom nodeSet
;
expressionAtom
: functionCall
| nodeSet
| literal
| parenthesis
;
早些时候是:
union
: expressions+=expressionAtom (WS? operator='|' WS? expressions+=expressionAtom)*
;
expressionAtom
: functionCall
| nodeSet
| literal
| parenthesis
;
过去没有出现性能问题。
在调试 XpathParser 时我发现这是因为 DFAState 有** requiresFullContext
作为 true
** 在这种情况下。
文档指出此的真实值“表明此状态是在 SLL 预测期间创建的,该预测发现状态中的配置之间存在冲突。”
你能帮我解决这个问题吗?是什么导致它搜索完整的上下文需要时间?
我不太了解Antlr,但是替换一下怎么样
pathExpression
: expressionAtom
| expressionAtom nodeSet
;
和
pathExpression
: expressionAtom nodeSet?
;