2016-07-25 19 views
2

Ich entwickle derzeit eine ANTLR4 JavaScript-Listener für diese Grammar.ANTLR4 JavaScript Target sehr langsam

var _require = require; 
    var antlr = _require('./antlr4/index'); 
    var javaLexer = _require('./generated/JavaLexer'); 
    var javaParser = _require('./generated/JavaParser'); 
    var javaListener = _require('./generated/JavaListener'); 

    declare function require(name:string); 

     class CodeAnalysis { 

     input: String; 

     constructor(input:String) { 
      this.input = input; 
      this.antlrStack(); 
     } 

    private antlrStack() { 
     console.log(this.input); 
     var chars = new antlr.InputStream(this.input); 
     var lexer = new javaLexer.JavaLexer(chars); 
     var tokens = new antlr.CommonTokenStream(lexer); 
     var parser = new javaParser.JavaParser(tokens); 
     var listener = new javaListener.JavaListener(); 
     parser.buildParseTrees = true; 
     var tree = parser.compilationUnit(); 


     antlr.tree.ParseTreeWalker.DEFAULT.walk(listener, tree); 
    } 

    public getInput() { 
    return this.input; 
    } 


    } 

Das Problem ist, dass die Leistung ist sehr schlecht (übernimmt zwei min) mit einem Eingang wie folgen aus:

import codescape.Dogbot; 
public class MyDogbot extends Dogbot{ 

    public void run() { 

    turnLeft(); 
    move(); 

    } 
} 

Die gleiche Grammatik und die gleichen Zuhörer in Java führt viel schneller (> 2 Sek).

Jeder eine Idee warum? Oder wie man es repariert?

Bruno

+0

Ich mache auch einen JS Zielparser mit ANTLR4. Es ist normalerweise langsam, aber es ist nicht unerträglich langsam. Was ich mache, wenn ich auf ein unerträgliches Ereignis stoße, ist, dass ich die Grammatik irgendwie modifiziere und die Geschwindigkeit normalerweise drastisch verbessere. – yoshi

+0

mit demselben Problem konfrontiert. Parsing durch Javascript Antlr4 ist viel langsamer als Java Antlr4. –

Antwort

1

Die ehrliche Wahrheit ist, dass es nur sein kann, dass Javascript eine viel langsamer Sprache ist .... man konnte sehen immer die analytics tools in Chrom oder einem anderen Browser und sehen, ob es Engpässe bei der ANTLR Laufzeit sind oder Ihre eigenen paar Zeilen Code, aber Chancen sind es mehr mit der Javascript engine performance zu tun, wie Javascript ist vollständig Text und Java ist zu Bytecode kompiliert und von einer niedrigeren Ebene mit einer virtuellen Maschine laufen, bedeutet dies die Bytecode ausgeführt wird in der Regel viel schneller als Die Interpretation des Bytecodes zum Maschinencode wird extrem schnell sein, während Javascript Zeile für Zeile interpretiert werden muss, um ausgeführt zu werden.