ANTLR4 - 监听器比访问者更快吗?

4

我正在尝试使用ANTLR4解析Java文件,并遍历解析树以查找特定的函数调用。

虽然我能够使用访问者(Visitor)监听器(Listener)两种方法来实现这一点,但压力测试表明,与广为流传的观点相反,监听器比访问者更快

从理论上讲,访问者应该更快,因为它们只会检查特定节点,而监听器则检查所有节点。有人知道为什么会出现这种情况吗?


与普遍信念相反,有任何相关的参考资料吗?"由于他们只会检查特定节点",ANTLR如何知道要跳过哪些节点以及访问哪些节点?ANTLR的监听器和访问器可以遍历所有节点。我猜两者之间的运行时间可以忽略不计。 - Bart Kiers
Antlr4的Listeners和Visitors - 应该实现哪一个?根据这个资源,如果我只访问我需要的节点,那么我将节省时间,因为我不会为其他节点调用visit方法(因为它们永远不会被访问),但是Listener将遍历所有节点,这难道不应该更耗时吗? - ramos
但是使用默认访问者将遍历整个树。因此,如果您扩展了默认访问者并覆盖了一些 visit...(...) 方法,则所有节点都将被访问。 - Bart Kiers
好的,我现在明白了。谢谢。 - ramos
1个回答

4

在ANTLR中,监听器应该比访问者更快,尽管性能差异可能不容易测量,如果有的话。

监听器使用ParseTreeWalker中的遍历算法。访问者使用AbstractParseTreeVisitor中的算法。两者都“考虑”所有节点。

除了轻微的实现差异外,唯一的定量差异是访问者调用涉及通用返回类型处理的开销。然而,在任何现代JVM中,对性能应该没有什么影响。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接