IntelliJ 中 ANTLR4 分析器显示的 DFA 缓存未命中是什么?

use*_*400 5 antlr4

IntelliJ 中 ANTLR4 分析器显示的 DFA 缓存未命中是什么?

在此输入图像描述

我可以看到 DFA 缓存未命中与解析时间增加有关。我可以做什么来减少它?有例子吗?

Mik*_*gal 1

(参考自适应 LL(*) 解析:动态分析的力量论文)

ALL(*) 解析器会记忆分析结果,以增量方式动态构建 DFA 缓存,将先行短语映射到预测结果。

为每个可能的解析器调用堆栈创建不同的先行 DFA 是不可行的,因为堆栈排列的数量在堆栈深度上是指数级的。相反,我们利用大多数决策对堆栈不敏感的事实,并构建忽略解析器调用堆栈的前瞻 DFA。

DFA 缓存未命中是 ANTLR 构建 DFA 缓存以优化性能的方式,因此在“预热”期间会出现这种情况,因为 ANTLR 遇到可以缓存 DFA 的前瞻。

我非常确定 5 次 DFA 缓存未命中(并且您的输入是一个 266 个字符行这一事实)意味着您根本无法读取缓存未命中次数中的任何内容。

一旦您通过解析器运行了合理数量的预期输入,它就开始成为一个有用的指标。为了获得最佳性能,它应该开始“适应”并看到越来越少的尚未缓存 DFA 的情况。

如果在大型输入语料库上您看到缓存未命中继续攀升,则表明语法的复杂性可能会导致问题。

您可能应该首先确定 DFA 缓存命中是否确实是您的性能问题(通过解析器运行大量输入并观察缓存未命中率是否随时间合理下降。

如果您发现这是一个问题,那么您可能会更幸运地发布一个更具体于您的语法的问题:为什么比率永远不会稳定下来。也许有人会评论一些常见的原因(我真的没有任何类型的检查清单)。