java8文件的antlr解析(python绑定)-运行时间慢



我正试图基于这个java 8语法,用antlr4扫描一个java 8文件。一切正常,除了运行时间:

input_stream = FileStream("/main.java")
lexer = Java8Lexer(input_stream)
stream = CommonTokenStream(lexer)
parser = Java8Parser(stream)
tree = parser.compilationUnit()
class GadgetIfStmtListener(Java8Listener):
# Enter a parse tree produced by Java8Parser#ifThenStatement.
def enterIfThenStatement(self, ctx:Java8Parser.IfThenStatementContext):
print(ctx.getText())
gadget = GadgetIfStmtListener()
walker = ParseTreeWalker()
walker.walk(gadget, tree)

main.java文件粘贴在末尾(一个简单的嵌套循环,用于计算[2,100]中的素数(。当我计时时,我得到:

$ time python3.6 main.py
if(i*j==p){returnfalse;}
if(isPrime(p)){System.out.format("%dn",p);}
real    0m14.611s

这合理吗?pldi的原始论文提到(其中一个例子是Java 1.5(

[…]示例的平均解析速度约为26000行/秒

以下是完整性的main.java文件:

class main {
private static boolean isPrime(int p)
{
for (int i=0;i<p;i++) {
for (int j=0;j<p;j++) {
if (i*j == p) {
return false; }}}
return true;
}
private static void printPrimes(int start, int end)
{
for (int p=start;p<=end;p++) {
if (isPrime(p)) {
System.out.format("%dn", p);
}}
}
public static void main(String[] args)
{
int start = 2;
int end = 100;
printPrimes(start, end);
System.out.println("Hello, World!");
}
}

这合理吗?

这是主观的,我没有学习语法,这也完全取决于你认为什么是合理的:(

pldi的原始论文提到(其中一个例子是Java 1.5(

众所周知,ANTLR目标之间存在巨大(我的意思是非常巨大(的差异。Python是,AFAIK,最慢的之一。当然,您可以通过更有效地重新排序解析器规则来压缩一些ms,但为了显著提高速度,请选择Java或C#目标(或者可能也是C++或C目标,但我没有使用它们的经验(。

请注意,您提到的论文讨论了(官方支持的(Java目标。除Java之外的所有其他目标都是(同样是AFAIK(社区创建/支持的。

最新更新