创建Xpath语法时遇到性能问题。
整个语法运行良好,直到我们添加了对xpath的支持,例如:
((div)[1]//span)[1]
或
((//div)[1]/div)[last()]
在语法文件中添加了对此的支持之后,上述xpath开始正常运行,但其他xpath开始出现性能问题。
喜欢这个:
//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秒(之前花费了170ms)。>>
这些是在附加的语法文件中添加/修改的代码行,开始出现性能问题:
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预测期间创建的,发现该状态中的配置之间存在冲突。”
您能帮我解决此问题吗,是什么导致它搜索需要时间的完整上下文?
我在为Xpath创建语法时遇到性能问题。整个语法运行良好,直到我们添加了对xpath的支持,例如:((div)[1] // span)[1]或((// div)[1] / div)[...
我不太了解Antlr,但是如何替换
pathExpression
: expressionAtom
| expressionAtom nodeSet
;