我正在尝试使用 ANTLR4 解析 java 文件并遍历解析树以搜索特定的函数调用。
虽然我可以同时使用Visitor 和Listener 方法来实现这一点,但压力测试表明与 Visitors 相比,Listeners 更快,这与普遍的看法相反。
从理论上讲,访问者应该更快,因为他们只会检查特定节点,而听众会检查所有节点。有人知道为什么会这样吗?
最佳答案
在 ANTLR 中,听众应该比访问者更快,尽管性能差异将不容易衡量,如果有的话。
Listeners 在 ParseTreeWalker
中使用 walker 算法.访客使用AbstractParseTreeVisitor
中的算法.两者都“考虑”了所有节点。
除了细微的实现差异之外,一个数量上的差异是访问者调用涉及通用返回类型处理的开销。尽管如此,在任何现代 JVM 中对性能的影响应该可以忽略不计。
关于ANTLR4 - 听众比访客更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49775816/