ANTLR4-与访客相比,听众速度更快?

ANTLR4-与访客相比,听众速度更快?,antlr4,Antlr4,我试图使用ANTLR4解析java文件,并遍历解析树搜索特定的函数调用 虽然我可以通过访客和听众两种方式实现这一点,但压力测试表明,与访客相比,听众的速度要快得多,这与普遍的看法相反 理论上,访问者应该更快,因为他们只会检查特定节点,而侦听器会检查所有节点。有人知道为什么会出现这种情况吗?在ANTLR中,听众应该比访客更快,尽管性能差异不容易测量(如果有的话) 侦听器在中使用walker算法。访问者在中使用该算法。两者都“考虑”所有节点 除了轻微的实现差异之外,一个数量上的差异是访问者调用涉及一

我试图使用ANTLR4解析java文件,并遍历解析树搜索特定的函数调用

虽然我可以通过访客和听众两种方式实现这一点,但压力测试表明,与访客相比,听众的速度要快得多,这与普遍的看法相反


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

在ANTLR中,听众应该比访客更快,尽管性能差异不容易测量(如果有的话)

侦听器在中使用walker算法。访问者在中使用该算法。两者都“考虑”所有节点


除了轻微的实现差异之外,一个数量上的差异是访问者调用涉及一般返回类型处理的开销。不过,在任何现代JVM中,这对性能的影响应该可以忽略不计。

“与流行的观点相反”有没有关于这方面的参考资料?“因为他们只会检查特定节点”ANTLR如何知道跳过哪个节点和访问哪个节点?ANTLR的侦听器和访问者遍历所有节点。我猜两者之间的运行时间可以忽略不计。。根据这个资源,如果我只访问我需要的节点,我将节省时间,因为我没有为其他节点调用visit方法(因为它们永远不会被访问),但侦听器将遍历所有节点,这不是更耗时吗?但是使用默认访问者将遍历整个树。因此,如果您扩展一个默认访问者,并覆盖一些
visit…(…)
方法,所有节点都将被访问。是的,我现在就知道了。谢谢