我正在尝试使用ANTLR4解析Java文件,并遍历解析树以查找特定的函数调用。
虽然我能够使用访问者(Visitor)和监听器(Listener)两种方法来实现这一点,但压力测试表明,与广为流传的观点相反,监听器比访问者更快。
从理论上讲,访问者应该更快,因为它们只会检查特定节点,而监听器则检查所有节点。有人知道为什么会出现这种情况吗?
我正在尝试使用ANTLR4解析Java文件,并遍历解析树以查找特定的函数调用。
虽然我能够使用访问者(Visitor)和监听器(Listener)两种方法来实现这一点,但压力测试表明,与广为流传的观点相反,监听器比访问者更快。
从理论上讲,访问者应该更快,因为它们只会检查特定节点,而监听器则检查所有节点。有人知道为什么会出现这种情况吗?
在ANTLR中,监听器应该比访问者更快,尽管性能差异可能不容易测量,如果有的话。
监听器使用ParseTreeWalker
中的遍历算法。访问者使用AbstractParseTreeVisitor
中的算法。两者都“考虑”所有节点。
除了轻微的实现差异外,唯一的定量差异是访问者调用涉及通用返回类型处理的开销。然而,在任何现代JVM中,对性能应该没有什么影响。
visit...(...)
方法,则所有节点都将被访问。 - Bart Kiers